Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中解析不带根的XML文件_Java_Xml_Parsing_Xml Parsing - Fatal编程技术网

在Java中解析不带根的XML文件

在Java中解析不带根的XML文件,java,xml,parsing,xml-parsing,Java,Xml,Parsing,Xml Parsing,我有一个没有根节点的XML文件。除了手动添加一个“假”根元素之外,还有什么方法可以用Java解析XML文件吗?谢谢。您的XML文档需要考虑根XML元素。没有这一点,您将无法使用xml解析器对其进行解析。一种方法是在不触及原始“xml”(格式不正确的“xml”)的情况下提供您自己的虚拟包装器。您需要以下词语: 语法 <!DOCTYPE some_root_elem SYSTEM "/home/ego/some.dtd" [ <!ENTITY entity-name "Some va

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

您的XML文档需要考虑根XML元素。没有这一点,您将无法使用xml解析器对其进行解析。

一种方法是在不触及原始“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>

&数据;

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

所以答案可能是你自己去做。Scanner或StringTokenizer可能会起作用


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

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

我可能也面临着这个问题。遗留代码,嗯

伊恩


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

您可以使用另一个类似的解析器。它可以在没有根的情况下解析XML。

以下是我所做的:

有一个旧的
java.io.SequenceInputStream
类,它太旧了,需要
枚举
,而不是
列表
之类的

使用它,您可以在无根XML流周围预先添加根元素标记(
)。(由于性能和内存方面的原因,不应该通过连接字符串来实现。)


如果它没有根节点,它就不是真正的XML文件。出于某种原因,添加一个“虚拟”根节点不是一个选项,还是您只是对替代方案感兴趣?Anon,谢谢您的回复,我想我正在寻找更优雅的。我知道这很讽刺,我正在寻找一个优雅的解决问题的方法。不过,我只是想知道,是否还有其他选择。我真的希望,没有这样的选择。为什么?因为像这样“放松”的标准遵从性根本无助于这些标准的实施。而且,希望有更多的人不想处理像非格式良好的xml这样的自产“标准”,而不是像他们这样的人。即使你能正确地解析它,你希望它的输出是什么?顶级元素的一系列文档节点?这仍然是相当混乱的。这和你自己把它包起来取下来没什么区别。谢谢你克罗克,谢谢你的回答。我知道XML格式良好的规则。然而,我正在处理一个糟糕的遗留场景,这就是我必须处理的问题,所以这就是为什么要寻找选项。谢谢。这仍然在围绕XML包装一些东西。我想知道的是,在Java中是否有办法通过在API中设置一些属性来解析XML;它实际上不需要存在于文件系统中。+1:这是我在类似情况下所做的,而且确实很容易。是的,类似于
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());
    }
}