2012-01-07 109 views
2

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

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

回答

1

有什么可疑的,你正在尝试做什么。

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

  • 如果它真的应该是真正的XML,那么无论写/生成文件都会有一个错误。

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


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

这样看来,你真正的问题是,你的characters(...)回调被单独呼吁&之前的文本为(解码)&,并最终为&后的文本。你只需要通过将文本块连接在一起来解决这个问题。

ContentHandler.characters()的Javadoc这样说:

“解析器将调用此方法来报告字符数据的每个块SAX解析器可以返回所有的连续字符数据在一个单一的块,或者他们可能会裂开。它分成几块......“

+0

的XLM文件是苹果XML的plist格式如下字符串&代表&对不起,我忘了在我的留言中提及! – Scott 2012-01-08 11:24:57

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 
    } 
} 
0

您是否对我们有摘录? 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(包含实体定义)可以帮助解析很多内容,因为它可以包含实体(如&amp;)到它们代表&的字符的映射,并且解析器可能能够为您进行合并。 (至少物化子树当蟒蛇XML拉解析器我喜欢用大文件一样。)

-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);