2009-02-06 7 views
3

J'ai un 'élément complexe' qui est en XML, puis un 'workitem' (en XML) qui contient beaucoup d'autres informations, et je voudrais que cela contienne une chaîne contenant l'élément complexe en XML.analyse XML qui contient XML dans les éléments, peut-il être fait

par exemple:

<inouts name="ClaimType" type="complex" value="<xml string here>"/> 

Cependant, en essayant SAX et d'autres parseurs java je ne peux pas le faire pour traiter cette ligne, il n'aime pas le < ou le « s» dans la chaîne, j'ai essayé s'échapper, et convertir le "à".

Y at-il de toute façon autour de cela? Ou devrais-je trouver une autre solution?

Merci

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas simplement contenir la valeur XML comme XML réel dans l'élément ? –

+0

Clarification: la valeur n'est pas un élément, c'est un attribut. –

Répondre

5

Je pense que vous trouverez que le XML que vous traitez n'analysera pas beaucoup d'analyseurs car il n'est pas valide. Si vous avez le contrôle sur le XML, vous aurez besoin à un strict minimum pour échapper à l'attribut il est donc quelque chose comme:

<inouts name="ClaimType" type="complex" value="&lt;xml string here&gt;" /> 

Ensuite, une fois que vous avez extrait l'attribut que vous pouvez éventuellement réanalysera pour traiter comme XML. Alternativement, vous pouvez prendre l'une des approches ci-dessus (en utilisant des sections CDATA) avec une ré-factorisation de votre XML.

Si vous n'avez aucun contrôle sur votre fichier XML, vous pouvez essayer d'utiliser le TagSoup library pour l'analyser afin de voir comment vous allez. (Disclaimer: J'ai seulement utilisé TagSoup pour le HTML, je ne sais pas comment ça se passerait avec du contenu non-HTML)

(Le site de tag soupe apparaît en réalité ATM, mais vous devriez être capable de trouver assez doco sur le web, et les téléchargements via le maven repository)

5

Peut-être la solution la plus simple serait d'utiliser une section CDATA. Vous pouvez convertir votre exemple pour ressembler à ceci:

<inouts name="ClaimType" type="complex"> 
    <![CDATA[ 
    <xml string here> 
    ]]> 
</inouts> 

Si vous avez plus d'un attribut que vous souhaitez stocker des chaînes complexes pour, vous pouvez utiliser plusieurs éléments enfants avec des noms différents:

<inouts name="ClaimType" type="complex"> 
    <value1> 
    <![CDATA[ 
     <xml string here> 
    ]]> 
    </value1> 
    <value2> 
    <![CDATA[ 
     <xml string here> 
    ]]> 
    </value2> 
</inouts> 

Ou plusieurs éléments de valeur avec un identifiant identifiant:

<inouts name="ClaimType" type="complex"> 
    <value id="complexString1"> 
    <![CDATA[ 
     <xml string here> 
    ]]> 
    </value> 
    <value id="complexString2"> 
    <![CDATA[ 
     <xml string here> 
    ]]> 
    </value> 
</inouts> 
0

Je ne sais pas comment cela fonctionne pour les attributs, et s'échapper (< comme < et> comme >) ne fonctionne pas, alors je ne sais pas.

S'il s'agissait d'un tag interne: vous pouvez utiliser le mécanisme Xml Any (jamais utilisé moi-même) ou le déclarer dans une section CDATA.

+0

encodage et d'échappement sont des choses différentes – Simon

+0

haha ​​oups :) patate! –

2

CDATA section ou escaping

NB Il y a une grande différence entre l'échappement et le codage, que certains autres affiches ont fait référence. Faites attention à confondre les deux.

0

vous êtes http://www.doingitwrong.com/

Si inouts/@value est vraiment arborescent (par exemple XML), alors il ne doit pas être un attribut, il devrait être un élément enfant:

<inout name="ClaimType" type="complex"> 
    <value> 
     <some-arbitrary> 
      <xml-stuff/> 
     </some-arbitrary> 
    </value> 
</inout> 

Dans le cas contraire, en fait, garanti d'être bien formé en XML, mais juste un peu comme ça parce que vous mettez des parenthèses pointues dedans, alors vous devriez vous demander s'il n'y a pas une meilleure façon de résoudre ce problème. Cela échoue, utilisez <![CDATA[ comme certains l'ont déjà suggéré.