在Java中解析没有root的XML文件

时间:2010-07-07 02:41:53

标签: java xml parsing xml-parsing

我有这个没有根节点的XML文件。除了手动添加“假”根元素之外,有什么方法可以用Java解析XML文件?感谢。

6 个答案:

答案 0 :(得分:5)

我想你可以创建一个新的InputStream实现,它包装你要解析的那个。此实现将在包装流中的字节之前返回开放根标记的字节,然后返回结束根标记的字节。这样做很简单。

我也可能遇到这个问题。遗产代码,嗯?

伊恩。

编辑:您还可以查看java.io.SequenceInputStream,它允许您将流附加到彼此。您需要将前缀和后缀放在字节数组中并将它们包装在ByteArrayInputStreams中,但这一切都非常简单。

答案 1 :(得分:4)

您的XML文档需要将根xml元素视为well formed。如果没有这个,你将无法使用xml解析器解析它。

答案 2 :(得分:3)

一种方法是提供你自己的虚拟包装而不触及原始的“xml”(形式不好的'xml')需要这个词:

<强>语法

<!DOCTYPE some_root_elem SYSTEM "/home/ego/some.dtd"
[
  <!ENTITY entity-name "Some value to be inserted at the entity">
]

示例:

<!DOCTYPE dummy [
<!ENTITY data SYSTEM "http://wherever-my-data-is">
]>
<dummy>
&data;
</dummy>

答案 3 :(得分:1)

您可以使用其他解析器,例如Jsoup。它可以在没有root的情况下解析XML。

答案 4 :(得分:0)

我认为即使任何API都有这样的选项,它也只会返回“XML”的第一个节点,它看起来像根,并丢弃其余节点。

所以答案可能就是自己做。 Scanner或StringTokenizer可能会成功。

也许某些html解析器可能有所帮助,它们通常不那么严格。

答案 5 :(得分:0)

这就是我所做的:

有一个古老的java.io.SequenceInputStream类,它太老了,以至于需要Enumeration而不是List之类的东西。

有了它,您可以在无根XML流周围添加和附加根元素标签(在我的情况下为<div></div>)。 (出于性能和内存的原因,您不应该通过串联字符串来做到这一点。)

public void tryExtractHighestHeader(ParserContext context)
{
    String xhtmlString = context.getBody();
    if (xhtmlString == null || "".equals(xhtmlString))
        return;

    // The XHTML needs to be wrapped, because it has no root element.
    ByteArrayInputStream divStart = new ByteArrayInputStream("<div>".getBytes(StandardCharsets.UTF_8));
    ByteArrayInputStream divEnd = new ByteArrayInputStream("</div>".getBytes(StandardCharsets.UTF_8));
    ByteArrayInputStream is = new ByteArrayInputStream(xhtmlString.getBytes(StandardCharsets.UTF_8));
    Enumeration<InputStream> streams = new IteratorEnumeration(Arrays.asList(new InputStream[]{divStart, is, divEnd}).iterator());

    try (SequenceInputStream wrapped = new SequenceInputStream(streams);) {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = builderFactory.newDocumentBuilder();
        Document xmlDocument = builder.parse(wrapped);

您可以在这里做任何您想做的事,但请记住额外的要素。

        XPath xPath = XPathFactory.newInstance().newXPath();
    }
    catch (Exception e) {
        throw new RuntimeException("Failed parsing XML: " + e.getMessage());
    }
}