【问题标题】:How to make SAXParser ignore escape codes如何让 SAXParser 忽略转义码
【发布时间】:2012-01-07 13:40:44
【问题描述】:

我正在编写一个 Java 程序来读取 XML 文件,实际上是一个 XML plist 格式的 iTunes 库。 除了遇到包含& 的文本时,我已经设法绕过这种格式引发的大多数障碍。 XLM 文件将此 & 符号表示为 &,而我只能设法读取任何特定文本部分中 & 之后的文本。

有没有办法禁用转义码检测?我正在使用 SAXParser。

【问题讨论】:

    标签: java saxparser html-escape-characters


    【解决方案1】:

    你正在尝试做的事情有些可疑。

    如果您尝试解析的文件格式包含裸 & 符号 (&),则它是 不是格式良好的 XML。 & 符号在格式良好的 XML 中表示为字符实体(例如 &)。

    • 如果它真的应该是真正的 XML,那么在任何写入/生成文件的内容中都存在错误。

    • 如果它不应该是真正的 XML(即那些 & 号不是错误),那么您可能不应该尝试使用 XML 解析器来解析它。


    啊,我明白了。 XML 实际上已正确编码,但您没有正确获取 SO 标记。

    看来你真正的问题是你的characters(...) 回调被分别调用& 之前的文本、(解码的)&,最后是& 之后的文本。您只需要通过将文本块重新组合在一起来处理这个问题。

    ContentHandler.characters() 的 javadoc 是这样说的:

    “解析器会调用这个方法来报告每一块字符数据。SAX 解析器可以在一个块中返回所有连续的字符数据,也可以将它分成几个块……” .

    【讨论】:

    • XLM 文件为 Apples XML plist 格式,& 用 & 表示对不起,我忘了在我的消息中提到这一点!。
    【解决方案2】:

    这可能不是转义字符的最佳通用解决方案,但我只需要考虑换行符,因此只需检查 \n 就很容易。

    您可以检查反斜杠 \ 仅检查所有转义字符或在您的情况下为 &,尽管我认为其他人会提供更优雅的解决方案。

    @Override
    public void characters(char[] ch, int start, int length) 
    {
        String elementData = new String(ch, start, length);
        boolean elementDataContainsNewLine = (elementData.indexOf("\n") != -1);
    
        if (!elementDataContainsNewLine) 
        {
            //do what you want if it is no new line
        }
    }
    

    【讨论】:

      【解决方案3】:

      你有摘录给我们吗?文件是 iTunes 生成的吗?如果是这样,对我来说,这听起来像是 iTunes 中的一个错误,它忘记了正确编码 & 符号。我不会感到惊讶:他们显然一开始就没有获得 XML,他们 <name>[key]</name><string>[value]</string> 的架构一定会让 XML 发明者呕吐。

      您可能想要使用不同的、更强大的解析器。只要文件格式正确,SAX 就很棒。然而,我不知道 dom4j 和 jdom 有多强大。试一试。对于python,我知道我会推荐ElementTreeBeautifulSoup,它们非常健壮。

      还可以查看http://code.google.com/p/xmlwise/,我发现 在 stackoverflow 中提到了这里(您使用了搜索吗?)。

      更新:(根据更新后的问题)您需要了解实体在 XML 和 SAX 中的作用。它们默认是一个单独的节点,就像文本节点一样。因此,您可能需要将它们与相邻的文本节点连接起来才能获得完整的值。您在解析器中使用 DTD 吗?使用适当的 DTD(带有实体定义)可以帮助进行很多解析,因为它可以包含从诸如 & 之类的实体到它们所代表的字符 & 的映射,并且解析器可能能够为您进行合并。 (至少我喜欢用于大文件的 python XML-pull 解析器在实现子树时会这样做。)

      【讨论】:

        【解决方案4】:

        我正在使用 SAXParser 解析下面的字符串

        <xml>
        <FirstTag>&amp;&lt;</FirstTag>
        <SecondTag>test</SecondTag>
        </xml>
        I want the same string to be retained but it is getting converted to below
        <xml>
        <FirstTag>&<</FirstTag>
        <SecondTag>test</SecondTag>
        <xml>
        Here is my code. How can I avoid this being converted?
        SAXParserFactory factory = SAXParserFactory.newInstance();
                SAXParser saxParser = factory.newSAXParser();
                MyHandler handler = new MyHandler();  
                values = handler.getValues();
                saxParser.parse(x, handler);
        

        【讨论】:

          猜你喜欢
          • 2013-04-18
          • 2011-09-05
          • 1970-01-01
          • 2021-05-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-12
          相关资源
          最近更新 更多