Как проанализировать DocumentFragment с помощью стандартного API DOM Java - PullRequest
4 голосов
/ 11 августа 2011

Вот как я могу разобрать правильно сформированный 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 ]

3 голосов
/ 11 августа 2011

Я просто подумал о глупом решении.Я мог бы обернуть фрагмент в фиктивный элемент следующим образом:

<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));
}

Но это немного неубедительнопосмотрите, есть ли другое решение.

0 голосов
/ 28 марта 2014

Более подробно о ответах, которые уже даны:

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;
}
0 голосов
/ 11 августа 2011

Я бы предложил не использовать 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

...