我正在写一个Java程序来读取和XML文件,实际上是一个XML库plist格式的iTunes库。 我设法绕过这种格式引发的大多数障碍,除非遇到包含&
的文本。 XLM文件将此&符号表示为&
,我只能设法在文本的任何特定部分中读取&
之后的文本。如何让SAXParser忽略转义码
有没有办法禁用转义码检测?我正在使用SAXParser。
我正在写一个Java程序来读取和XML文件,实际上是一个XML库plist格式的iTunes库。 我设法绕过这种格式引发的大多数障碍,除非遇到包含&
的文本。 XLM文件将此&符号表示为&
,我只能设法在文本的任何特定部分中读取&
之后的文本。如何让SAXParser忽略转义码
有没有办法禁用转义码检测?我正在使用SAXParser。
有什么可疑的,你正在尝试做什么。
如果您尝试解析的文件格式包含裸符号(&
)字符,那么它是而不是格式良好的XML。 &符号在格式良好的XML中表示为字符实体(例如&
)。
如果它真的应该是真正的XML,那么无论写/生成文件都会有一个错误。
如果它不应该是真正的XML(即那些&符号不是错误),那么你可能不应该试图用XML解析器解析它。
啊,我明白了。 XML实际上是正确编码的,但是你没有得到SO标记。
这样看来,你真正的问题是,你的characters(...)
回调被单独呼吁&
之前的文本为(解码)&
,并最终为&
后的文本。你只需要通过将文本块连接在一起来解决这个问题。
为ContentHandler.characters()
的Javadoc这样说:
“解析器将调用此方法来报告字符数据的每个块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
,它们非常强大。
也看看http://code.google.com/p/xmlwise/其中我发现这里在stackoverflow(你使用搜索?)。
更新:(按照更新的问题)你需要了解XML实体,因此SAX的作用。它们默认是一个单独的节点,就像文本节点一样。因此,您可能需要将它们与相邻的文本节点结合以获得完整的值。你的解析器中使用了DTD吗?使用适当的DTD(包含实体定义)可以帮助解析很多内容,因为它可以包含实体(如&
)到它们代表&
的字符的映射,并且解析器可能能够为您进行合并。 (至少物化子树当蟒蛇XML拉解析器我喜欢用大文件一样。)
我解析使用的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);
的XLM文件是苹果XML的plist格式如下字符串&代表&对不起,我忘了在我的留言中提及! – Scott 2012-01-08 11:24:57