我正在编写一个Java程序来读取和XML文件,实际上是一个XML plist格式的iTunes库。
除了遇到包含&
的文本时,我已设法解决此格式引发的大多数障碍。 XLM文件将此&符号表示为&
,我只能设法在文本的任何特定部分中阅读&
之后的文本。
有没有办法禁用转义代码检测?我正在使用SAXParser。
答案 0 :(得分:1)
你想要做的事情有些可疑。
如果您尝试解析的文件格式包含裸&符号(&
)字符,那么不是格式良好的XML。 &符号在格式良好的XML中表示为字符实体(例如&
)。
如果它真的应该是真正的XML,那么在编写/生成文件时会有一个错误。
如果它不应该是真正的XML(即那些&符号不是错误的),那么你可能不应该尝试使用XML解析器解析它。
您的真正问题似乎是characters(...)
回调是针对&
之前的文本,(已解码的)&
单独调用的,最后是文本在&
之后。你只需要将文本块重新组合在一起就可以解决这个问题。
ContentHandler.characters()
的javadoc说:
“Parser将调用此方法来报告每个字符数据块.SAX解析器可以在一个块中返回所有连续的字符数据,或者它们可以将它分成几个块......”
答案 1 :(得分: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
}
}
答案 2 :(得分:0)
你有摘录吗? itunes生成的文件是?如果是这样,对我来说这听起来像是一个bug,忘了正确编码&符号。我不会感到惊讶:他们显然没有首先获得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解析器在实现子树时会这样做。)
答案 3 :(得分:-1)
我使用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);