Java / Android:解析XML以获取特定标记中的所有xml

时间:2012-07-11 16:17:00

标签: java android xml string parsing

我正在用java编程(最终在Android中编程),我有一个像这样的设置

<A>
  <B>
    <C>stuff</C>
     <D>
       <E>other stuff</E>
       <F>more stuff</F>
     </D>
  </B>

  <B>
    <C>stuff</C>
  </B>

   <B>
     <C>some stuff</C>
     <D>
        <E>basic stuff</E>
        <F>even more stuff</F>
     </D>
  </B>
</A>

我想解析它,以便我们得到(在我已经编码的其他事物中)所有D都中的东西,所以我们得到的字符串看起来像

<E>other stuff</E>
<F>more stuff</F>

空字符串(“”)和

<E>basic stuff</E>
<F>even more stuff</F>

我一直在使用的解析器一旦达到小于符号'&lt;'就会停止,所以它一直没有给我任何东西。有没有办法像我在Java中描述的那样解析它?

编辑:我刚刚将它转换为字符串并使用正则表达式。

2 个答案:

答案 0 :(得分:0)

要将已解析的XML转换回字符串,您可以使用javax.xml.transform.Transformer。我附加了解析您的示例XML并将所有D元素打印到控制台的代码 - 我认为您可以将其转换为您想要的内容:)

// The below is simply to create a document to test the code with
String xml = "<A><B><C>stuff</C><D><E>other stuff</E><F>more stuff</F></D></B><B><C>stuff</C></B><B><C>some stuff</C><D><E>basic stuff</E><F>even more stuff</F></D></B></A>";

DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputSource docSource = new InputSource(new StringReader(xml));
Document document = documentBuilder.parse(docSource);
// The above is simply to create a document to test the code with

// Transformer takes a DOMSource pointed at a Node and outputs it as text
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// Add new lines for every element
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// Skip the <? xml ... ?> prolog
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

NodeList elements = document.getElementsByTagName("D");
StringWriter sw = new StringWriter();
StreamResult res = new StreamResult(sw);
DOMSource source = new DOMSource();
for (int i = 0; i < elements.getLength(); i++) {
    Element element = (Element) elements.item(i);
    source.setNode(element);
    // Write the current element to the stringwriter via the streamresult
    transformer.transform(source, res); 
}
System.out.println(sw.toString());

如果您只想要元素的内容,可以像这样替换for循环:

for (int i = 0; i < elements.getLength(); i++) {
    Element element = (Element) elements.item(i);
    NodeList childNodes = element.getChildNodes();
    for (int j = 0; j < childNodes.getLength(); j++) {
        Node childNode = childNodes.item(j);
        source.setNode(childNode);
        transformer.transform(source, res);
    }

}

答案 1 :(得分:0)

您需要使用已编写的解析器。

不要使用自己卷起的,你只是要求自己解决问题。