【问题标题】:Java SAX parser startElement not seeing tagsJava SAX 解析器 startElement 看不到标签
【发布时间】:2012-06-11 22:59:12
【问题描述】:

示例 XML:

<rss version="2.0">
<channel>
<title>The Channel Title Goes Here</title>
<description>
The explanation of how the items are related goes here
</description>
<link>/events</link>
<item>
<title>
<![CDATA[ some title ]]>
</title>
<description>
<![CDATA[ ]]>
</description>
<content:encoded xmlns:content="http://stuff.com">
<![CDATA[ 
    <event>
        <name>some name</name>
        <startdate>some date</startdate>
        <starttime>some time</starttime>
        <location>some place</location>
        <description></description>
    </event>
]]>
</content:encoded>
</item>
<item>
</item>
...
</channel>
</rss>

我的 SAX 解析器 startElement 方法永远不会进入下面的 if 语句,但是 sysout 将“事件”打印到 logcat。为什么它永远找不到localName.equals("event")true

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 
{
    System.out.println(localName);

    if (localName.equals("event"))      // <-- never goes in here
    {
        // do stuff
    }
}

这与 CDATA 以及我如何设置解析器有关吗?以下是我实例化所有内容的方式:

URL sourceUrl = new URL(kEventsURL);

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
XMLReader xr = sp.getXMLReader();

MyXMLHandler myXMLHandler = new MyXMLHandler();
xr.setContentHandler(myXMLHandler);
xr.parse(new InputSource(sourceUrl.openStream()));

【问题讨论】:

  • 这并不奇怪,不是吗? CDATA 部分通常包含不符合 XML 格式或结构的文本,因此会被解析器忽略(意思是:它被认为是纯文本)。我不知道更改此标准化行为的设置,但由于在您的情况下,CDATA 部分基本上是另一个 XML 层次结构,我不明白为什么您不能将它委托给另一个 SAX 解析器实例。

标签: java android xml-parsing sax saxparser


【解决方案1】:

阅读第一个答案here 以了解为什么它无法识别标签开始。您可能应该使用来自元素的文本运行另一个解析器。

【讨论】:

  • 如何从 URL 数据中获取字符串?我可以删除 cdata 标签并正常解析它。
  • 如果您要删除字符串,您将已经完全扫描字符串数据一次。还会有一些字符串操作开销 - 对象创建。但它的性能可能真的很小。
  • 删除了 字符并运行了解析器,它工作了。感谢您的帮助。
【解决方案2】:

用“qName”代替“localName”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2017-08-14
    • 2012-04-27
    • 2012-07-22
    • 2017-05-04
    • 2013-01-08
    相关资源
    最近更新 更多