2011-04-29 13 views
5

tengo un XML como el siguiente:Cómo recuperar un elemento mixto de niños como texto (JDOM)

<documentation> 
    This value must be <i>bigger</i> than the other. 
</documentation> 

Usando JDOM, puedo conseguir las siguientes estructuras del texto:

Document d = new SAXBuilder().build(new StringReader(s)); 
System.out.printf("getText:   '%s'%n", d.getRootElement().getText()); 
System.out.printf("getTextNormalize: '%s'%n", d.getRootElement().getTextNormalize()); 
System.out.printf("getTextTrim:  '%s'%n", d.getRootElement().getTextTrim()); 
System.out.printf("getValue:   '%s'%n", d.getRootElement().getValue()); 

que dan me las siguientes salidas:

getText:   ' 
    This value must be than the other. 
' 
getTextNormalize: 'This value must be than the other.' 
getTextTrim:  'This value must be than the other.' 
getValue:   ' 
    This value must be bigger than the other. 
' 

lo que realmente quería era conseguir que el contenido del elemento en forma de cadena, es decir, "This value must be <i>bigger</i> than the other.". getValue() se acerca, pero elimina la etiqueta <i>. Supongo que quería algo como innerHTML para documentos XML ...

¿Debo simplemente usar un XMLOutputter en los contenidos? ¿O hay una mejor alternativa?

+0

¿Alguna vez encontró una buena respuesta a esta pregunta? –

+1

Mire la solución de Prashant Bhate en esta página, ya que creo que es la respuesta que está buscando: http://stackoverflow.com/questions/7910474/how-to-get-node-contents-from-jdom –

Respuesta

-1

yo diría que debe cambiar su documento a

<documentation> 
    <![CDATA[This value must be <i>bigger</i> than the other.]]> 
</documentation> 

con el fin de cumplir con la especificación XML. De lo contrario, <i> se consideraría un elemento secundario de <documentation> y no de contenido.

+0

Supongo que esta podría ser la forma más rápida. Intentará. En una nota lateral, sin embargo, ese elemento de documentación es un 'xsd: documentation', cuyo contenido se declara como' any', por lo que el ejemplo es técnicamente correcto ... –

+0

Un nodo hijo en medio de contenido mixto NO implica que el nodo no es realmente un nodo. –

-1

Jericho HTML es ideal para este tipo de tarea. Esto se puede hacer exactamente lo que estamos tratando de hacer con un bloque de código como este:

String snippet = new Source(html).getFirstElement().getContent().toString(); 

También es ideal para trabajar con HTML en general, ya que no trata de forzar a la existencia XML que ... lo trata con mucha más indulgencia.

+0

Esto es interesante, lo intentaré en algún momento. En este momento prefiero evitar agregar otra dependencia al proyecto ... –

+0

Tiene un documento JDom, no HTML. XML! = HTML. –

+0

@ james.garriss Por supuesto, HTML y XML son diferentes. Mi punto era que uno podría usar Jericho para simplificar una tarea que puede ser molesta tratar a través de engorrosas API XML. – stevevls

0

En JDOM pseudocódigo:

for Object o in d.getRootElement().getContents() 
    if o instanceOf Element 
     print <o.getName>o.getText</o.getName> 
    else // it's a text 
     print o.getText() 

Sin embargo, como Prashant Bhate wrote: content.getText() da texto inmediata que sólo es bien útil con los elementos de la hoja con contenido de texto.

Cuestiones relacionadas