6

これは、Javaで整形式のXMLドキュメントを解析する方法です。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

// text contains the XML content
Document doc = builder.parse(new InputSource(new StringReader(text)));

テキストの例は次のとおりです。

<a>
  <b/>
</a>

DocumentFragmentを解析するにはどうすればよいですか?たとえば、これは次のとおりです。

<a>
  <b/>
</a>
<a>
  <b/>
</a>

注:org.w3c.dom可能であれば、他のライブラリ/テクノロジーは使用しません。

4

3 に答える 3

6

私はばかげた解決策を考えました。次のようなダミー要素でフラグメントをラップできます。

<dummy><a>
  <b/>
</a>
<a>
  <b/>
</a></dummy>

次に、次のように、プログラムでそのダミー要素を再度除外します。

String wrapped = "<dummy>" + text + "</dummy>";
Document parsed = builder.parse(new InputSource(new StringReader(wrapped)));
DocumentFragment fragment = parsed.createDocumentFragment();

// Here, the document element is the <dummy/> element.
NodeList children = parsed.getDocumentElement().getChildNodes();

// Move dummy's children over to the document fragment
while (children.getLength() > 0) {
    fragment.appendChild(children.item(0));
}

しかし、それは少し足りないです、他の解決策があるかどうか見てみましょう。

于 2011-08-11T13:12:43.453 に答える
0

すでに与えられた答えをさらに拡張します:

public static DocumentFragment stringToFragment(Document document, String source) throws Exception
{
    source = "<dummy>" + source + "</dummy>";
    Node node = stringToDom(source).getDocumentElement();
    node = document.importNode(node, true);
    DocumentFragment fragment = document.createDocumentFragment();
    NodeList children = node.getChildNodes();
    while (children.getLength() > 0)
    {
        fragment.appendChild(children.item(0));
    }
    return fragment;
}
于 2014-03-28T18:01:37.200 に答える
-2

DOMAPIを使用しないことをお勧めします。遅くて醜いです。

代わりにストリーミングStAXを使用してください。JDK1.6以降に組み込まれています。一度に1つの要素をフェッチでき、ルート要素が欠落していてもチョークは発生しません。

http://en.wikipedia.org/wiki/StAX

http://download.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html

于 2011-08-11T17:41:34.003 に答える