Выбор необработанного текста XML - PullRequest
2 голосов
/ 10 августа 2011

Учитывая xml, как это:

<container>
    <item>
        <xmlText>
            <someTag>           
                <otherTag>
                    Text
                </otherTag>
            </someTag>
        </xmlText>
    </item>
<container>

Я бы хотел выбрать весь текст , который находится в item / xmlText. Я хотел бы напечатать все содержимое этого узла с тегами (someTag, otherTag).

Я бы предпочел справиться с этим с помощью XPath, но это часть Java-программы, поэтому, если есть такой механизм, я мог бы использовать и его.

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

Используйте для этого XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select="/container/item/xmlText/node()"/>
 </xsl:template>
</xsl:stylesheet>

Когда это применяется к предоставленному документу XML (исправлено, чтобы оно было правильно сформировано !!!):

<container>
    <item>
        <xmlText>
            <someTag>
                <otherTag>
                 Text
                </otherTag>
            </someTag>
        </xmlText>
    </item>
</container>

желаемый, правильный результат получается :

<someTag>
   <otherTag>
                 Text
                </otherTag>
</someTag>
0 голосов
/ 10 августа 2011

Когда это ваш элемент, полученный с XPath

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

Element element = (Element) xpath.evaluate(
  "/container/item/xmlText", document,  XPathConstants.NODE);

Затем вы можете сделать что-то вроде этого:

java.io.ByteArrayOutputStream data =
  new java.io.ByteArrayOutputStream();
java.io.PrintStream ps = new java.io.PrintStream(data);

// These classes are part of Xerces. But you will find them in your JDK,
// as well, in a different package. Use any encoding here:
org.apache.xml.serialize.OutputFormat of = 
  new org.apache.xml.serialize.OutputFormat("XML", "ISO-8859-1", true);
org.apache.xml.serialize.XMLSerializer serializer = 
  new org.apache.xml.serialize.XMLSerializer(ps, of);

// Here, serialize the element that you obtained using your XPath expression.
serializer.asDOMSerializer();
serializer.serialize(element);

// The output stream now holds serialized XML data, including tags/attributes...
return data.toString();

UPDATE

Это было бы более кратко, чем использование внутренних элементов Xerces. Это то же самое, что и решение Dimitre, но не с таблицей стилей XSLT, а с Java:

ByteArrayOutputStream out = new ByteArrayOutputStream();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
Source source = new DOMSource(element);
Result target = new StreamResult(out);
transformer.transform(source, target);

return out.toString();
...