2

我正在编写一个 Java 程序来读取 XML 文件,实际上是一个 XML plist 格式的 iTunes 库。除了遇到包含&. XLM 文件将这个 & 表示为&,我只能设法读取&任何特定文本部分中的文本。

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

4

4 回答 4

1

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

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

  • 如果它真的应该是真正的 XML,那么无论写入/生成文件都存在错误。

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


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

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

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

“解析器将调用此方法来报告每个字符数据块。SAX 解析器可能会在单个块中返回所有连续的字符数据,或者它们可能会将其拆分为多个块......”

于 2012-01-08T00:00:22.713 回答
0

这可能不是转义字符的最佳通用解决方案,但我只需要考虑新行,因此很容易检查 \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
    }
}
于 2012-01-07T13:52:58.370 回答
0

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

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

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

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

于 2012-01-08T10:45:38.997 回答
-1

我正在使用 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);
于 2016-05-02T04:41:35.077 回答