【问题标题】:Parsing pseudo XML file in Java在 Java 中解析伪 XML 文件
【发布时间】:2011-08-11 22:37:15
【问题描述】:

我正在尝试从一个伪 XML 格式的文件中解析文本。当它具有以下结构时,我可以从中获取 DOM 文档:

<product>
    <product_id>234567</product_id>
    <description>abc</description>
</product>

我遇到的问题发生在结构类似于以下时:

<product>
    <product_id>234567</product_id>
    <description>abc</description>
    <quantity 1:2>
        <version>1.1</version>
    </quantity 1:2>
        <version>1.2</version>
    <quantity 2:2>
    </quantity 2:2>
</product>

由于&lt;quantity 1:2&gt;中的空格,它会生成以下异常:

org.xml.sax.SAXParseException:[Fatal Error] :1:167: Element type " quantity " must be followed by either attribute specifications, ">" or "/>"

我可以通过用下划线替换空格来解决这个问题。问题是结构的大小可能不同,并且包含多个具有相同格式的子节点 (&lt;node 1:x&gt;),并且文件可能包含数百个要解析的结构。是否有可用的类可以解析这样的文本并返回树状对象?

【问题讨论】:

    标签: java xml parsing


    【解决方案1】:

    您的文件根本不是 XML,SAX 是用于 XML(XML 的简单 API)。您应该重新考虑您的结构,以便您可以执行以下操作:

    <quantity myAttr="1.2">
        <version>1.2</version>
    </quantity>
    <quantity myAttr="1.x">
        <version>1.1</version>
    </quantity>
    <version>1.0</version>
    

    或者类似的东西。

    【讨论】:

      【解决方案2】:

      预处理文件并将 x:y 形式的元素更改为 &lt;element value="x:y"/&gt;,这样您的 DOM/SAX 解析器就不会阻塞。

      我建议使用正则表达式来帮助但that way leads to madness

      【讨论】:

        【解决方案3】:

        由于&lt;quantity 1:2&gt;中的空格会产生以下异常

        这不是错误的根本原因,正如人们已经提到的,根本原因是您的文件格式不是有效的 XML。有效的 XML 标记应类似于 &lt;quantity attr1="val1" attr2="val2&gt;

        听起来您无法控制文件格式。在这种情况下,我认为最简单的方法是将文件预处理为有效的 XML,然后使用 DOM/SAX 解析器对其进行解析:

        FileInputStream file = new FileInputStream("pseudo.pxml");
        ByteArrayOutputStream temp = new ByteArrayOutputStream();
        int c = -1;
        
        while ((c=file.read()) >= 0){
           temp.write(c);
        }
        
        String xml = new String(temp.toByteArray());
        xml = xml.replaceAll("([^:\s]+:[^:\s]+)", "value=\"\\1\"");
        
        ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.getBytes());
        
        /* use xmlIn for your XML parsers */
        

        请注意,我没有测试此代码,也没有对其进行优化;只是想给你一个想法。

        【讨论】:

        • 我创建了一个类来将文件预处理为有效的 XML。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        相关资源
        最近更新 更多