Как проанализировать DocumentFragment с помощью стандартного API DOM Java
Вот как я могу разобрать правильно сформированный XML-документ в Java:
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
и никаких других библиотек / технологий, если это возможно.
3 ответа
Я просто подумал о глупом решении. Я мог бы обернуть фрагмент в фиктивный элемент следующим образом:
<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));
}
Но это немного отстойно, посмотрим, есть ли другое решение.
Более подробно остановимся на уже полученных ответах:
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;
}
Я бы предложил не использовать DOM API. Это медленно и безобразно.
Вместо этого используйте потоковый StAX. Он встроен в JDK 1.6+. Вы можете выбрать один элемент за раз, и он не захлебнется, если вы пропустите корневой элемент.
http://en.wikipedia.org/wiki/StAX
http://download.oracle.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html