【问题标题】:Java: skip binary data in xml file while parsingJava:解析时跳过xml文件中的二进制数据
【发布时间】:2012-07-31 16:48:59
【问题描述】:

我想在java中解析一个包含二进制数据的xml文件:这里是xml文件的一个例子:

<?xml version="1.0" encoding="utf-8"?>
<documents>
  <document>
    <element name="docid">
      <value><![CDATA[0902307e8004c74c]]></value>
    </element>
    <element name="published">
      <value><![CDATA[2012-01-01T00:00:00]]></value>
    </element>
    <element name="documenttype">
      <value><![CDATA[Circular]]></value>
    </element>
    <element name="data">
      <value><![CDATA[%PDF-1.6
%����
1020 0 obj
<</Filter/FlateDecode/First 20/Length 270/N 3/Type/ObjStm>>stream
�o^���)|�,�Ypoef�
l���o�>����u���b"Cb�|���%&��D�yD��q�q�q�q�q��%_ja�LJob��/��3"=����o���]V11}�    }a�+'6@����C�,^}�d%�۠�`s��q��5�׷^(�N��{S<S�����A��������-������f\ڌ��|U/݌�z���f�I9����g�g���s���0z'��X~
endstream
endobj
startxref
55097
%%EOF
]]></value>
    </element>
    <element name="dataname">
      <value><![CDATA[sdfsfsfsdsdfsd.pdf]]></value>
    </element>
  </document>
</documents>

通常我会这样解析这样的 xml 文件:

Document doc = null;
DocumentBuilder documentBuilder = null;
documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            documentBuilder = documentBuilderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
try {

            doc = documentBuilder.parse(fastXMLFile);

        } catch (SAXException e) {
            System.out.println("SAXExept");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Test");
            return;
        }

但由于包含二进制数据的“数据”元素,调试器告诉我:

[Fatal Error] xmlfile.xml:58:10: An invalid XML character (Unicode: 0x1a) was found in the CDATA section.
SAXExept
org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x1a) was found in the CDATA section.

我现在不需要解析这个数据字段,我可以跳过它。我只想解析其余的数据。这可能吗?

【问题讨论】:

    标签: java xml parsing binary


    【解决方案1】:

    由于您的 XML 包含无效字符(如异常所示),您不能期望库能够成功解析它。由于您无法更改 XML 文件的创建过程,并且由于您看不到搜索引擎的代码,我相信对您来说最简单的方法是从 XML 中删除无效字符。

    所以过程是:

    1-将XML的内容读入String

    2- 解析字符串并删除所有无效字符

    3- 将字符串写回文件中。如果无法修改原始文件,则创建一个新文件

    4- 解析修改/新文件。

    要替换无效字符,请参阅以下链接,因为它还包含一种方法。

    Invalid XML Characters: when valid UTF8 does not mean valid XML.

    【讨论】:

    • 我认为这暂时可行,但我无法想象这是最终的解决方案。我们的搜索引擎还必须以某种方式解析这些数据....对于我的问题,我并不真的需要解析二进制数据,所以我把它剪掉了,但我真的很感兴趣如何以不同的方式处理它。当我在 Notepad++ 中打开 xml 时,它会识别 xml 的所有节点。 xml 文件的某些部分没有正确显示...所以文本是灰色的...但所有节点都是正确的。这意味着我的 xml 文件的实际结构也是正确的。所以我不知道为什么不能解析整个事情。
    • 当我无法读取 xml 时,如何将 XML 转换为字符串?
    • 因为有解析 XML 文档的标准并且它们允许这种情况。如果您想编写自己的不遵循标准并处理异常情况的解析器,您可以这样做。这实际上是您的搜索引擎最有可能发生的情况。 notepad++ 不解析您的 xml。结构正确,因此您可以正确看到节点,但没有解析。
    • 不是通过 xml 解析器读取它,而是像读取文本文件一样读取它。
    • 我照你说的做了,效果很好。非常感谢你。如果有人找到了如何让二进制数据保持活力的答案,那将是一个很大的乐趣,但现在这个解决方案对我来说很好。
    【解决方案2】:

    您的 XML 文档无效。 PDF 数据应为 base64 编码或 HEX。 我认为除了更改您的文档之外没有其他解决方案。

    问候

    【讨论】:

    • 问题是,这个文档是由我们的搜索引擎的一个国际程序创建的。我什么都改变不了。好吧,我跳过了一些二进制数据……也许这让你感到困惑。没有解决办法吗?
    • 这一定是可能的,因为我们的搜索引擎能够解析这样的 xml 文件,但当然我无法获得它的代码。我只想编写自己的解析。我还可以看到,当我复制顶部的 xml 文件时,该文件是错误的,但我无法粘贴整个 xml 文档,因为它包含我无法共享的公司内部数据。
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2011-11-23
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多