如何使SAXParser忽略转义码

时间:2012-01-07 13:40:44

标签: java saxparser html-escape-characters

我正在编写一个Java程序来读取和XML文件,实际上是一个XML plist格式的iTunes库。 除了遇到包含&的文本时,我已设法解决此格式引发的大多数障碍。 XLM文件将此&符号表示为&,我只能设法在文本的任何特定部分中阅读&之后的文本。

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

4 个答案:

答案 0 :(得分:1)

你想要做的事情有些可疑。

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

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

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


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

您的真正问题似乎是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,我知道我会推荐非常健壮的ElementTreeBeautifulSoup

另请查看我在stackoverflow中找到提到的http://code.google.com/p/xmlwise/ (您是否使用过搜索?)。

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

答案 3 :(得分:-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);