我有这个没有根节点的XML文件。除了手动添加“假”根元素之外,有什么方法可以用Java解析XML文件?感谢。
答案 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());
}
}