我正在编写一个 Java 程序来读取 XML 文件,实际上是一个 XML plist 格式的 iTunes 库。除了遇到包含&
. XLM 文件将这个 & 表示为&
,我只能设法读取&
任何特定文本部分中的文本。
有没有办法禁用转义码的检测?我正在使用 SAXParser。
我正在编写一个 Java 程序来读取 XML 文件,实际上是一个 XML plist 格式的 iTunes 库。除了遇到包含&
. XLM 文件将这个 & 表示为&
,我只能设法读取&
任何特定文本部分中的文本。
有没有办法禁用转义码的检测?我正在使用 SAXParser。
您正在尝试做的事情有些可疑。
如果您尝试解析的文件格式包含裸 & 符号 ( &
) 字符,则它不是格式良好的 XML。&
& 符号在格式良好的 XML中表示为字符实体(例如)。
如果它真的应该是真正的 XML,那么无论写入/生成文件都存在错误。
如果它不应该是真正的 XML(即那些 & 符号不是错误的),那么您可能不应该尝试使用 XML 解析器来解析它。
啊,我明白了。XML 实际上是正确编码的,但是您没有正确获得 SO 标记。
看来您真正的问题是,您的characters(...)
回调被分别为 . 之前的文本&
、 (decoded)&
和最后的&
. 您只需要通过将文本块重新组合在一起来处理这个问题。
javadoc forContentHandler.characters()
是这样说的:
“解析器将调用此方法来报告每个字符数据块。SAX 解析器可能会在单个块中返回所有连续的字符数据,或者它们可能会将其拆分为多个块......”。
这可能不是转义字符的最佳通用解决方案,但我只需要考虑新行,因此很容易检查 \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
}
}
你有摘录给我们吗?文件是 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 - 带有实体定义 - 可以帮助解析很多,因为它可以包含从实体&
到它们所代表的字符的映射&
,并且解析器可能能够为您进行合并。(至少我喜欢用于大型文件的 python XML-pull 解析器在实现子树时会这样做。)
我正在使用 SAXParser 解析以下字符串
<xml>
<FirstTag>&<</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);