0

私は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>

私が使用しているパーサーは、小なり記号「<」にヒットするとすぐに停止するため、何も与えられません。Javaで説明した方法で解析する方法はありますか?

編集:文字列に変換し、正規表現を使用しました。

4

2 に答える 2

0

すでに作成されているパーサーを使用する必要があります。

自分で転がしたものは使用しないでください。自分で問題を起こすように求めているだけです。

于 2012-07-12T01:11:17.513 に答える
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);
    }

}
于 2012-07-11T16:58:00.153 に答える