使用 SAX 解析器解析自关闭 XML 标记时遇到问题

Posted

技术标签:

【中文标题】使用 SAX 解析器解析自关闭 XML 标记时遇到问题【英文标题】:Trouble parsing self closing XML tags using SAX parser 【发布时间】:2011-02-12 01:06:56 【问题描述】:

我在使用 SAX 解析自闭合 XML 标记时遇到问题。我正在尝试从 Google Base API 中提取链接标签。我在解析常规标签方面取得了相当大的成功。

这是xml的sn-p

<entry>
  <id>http://www.google.com/base/feeds/snippets/15802191394735287303</id>
  <published>2010-04-05T11:00:00.000Z</published>
  <updated>2010-04-24T19:00:07.000Z</updated>
  <category scheme='http://base.google.com/categories/itemtypes' term='Products'/>
  <title type='text'>En-el1 Li-ion Battery+charger For Nikon Digital Camera</title>
  <link rel='alternate' type='text/html' href='http://rover.ebay.com/rover/1/711-67261-24966-0/2?ipn=psmain&amp;icep_vectorid=263602&amp;kwid=1&amp;mtid=691&amp;crlp=1_263602&amp;icep_item_id=170468125748&amp;itemid=170468125748'/>
.
.

等等

我可以解析更新和发布的标签,但不能解析链接和类别标签。

这是我的 startElement 和 endElement 覆盖

public void startElement(String uri, String localName, String qName,
     Attributes attributes) throws SAXException 
     if (qName.equals("title") && xmlTags.peek().equals("entry")) 

     insideEntryTitle = true;

    
   xmlTags.push(qName);

 

public void endElement(String uri, String localName, String qName)
     throws SAXException 
   // If a "title" element is closed, we start a new line, to prepare
   // printing the new title.

   xmlTags.pop();
   if (insideEntryTitle) 
     insideEntryTitle = false;
  System.out.println();
   
 

xmltags 的声明..

private Stack<String> xmlTags = new Stack<String>(); 

有帮助吗?

这是我在这里的第一篇文章.. 我希望我遵守了发帖规则!非常感谢你们..

更正:endElement 被调用。 characters 没有。

public void characters(char[] ch, int start, int length) throws SAXException 

    if (insideEntryTitle)
    
        String url= new String(ch, start, length);
        System.out.println("url="+title);
        i++;
    

【问题讨论】:

您应该确保所有块代码都缩进四个空格(这次我已经为您编辑了)。这也适用于 xml 示例。 有什么症状?两个方法都没有被调用,还是只有一个? 会牢记这一点!仅调用起始元素。 哦顺便说一句..谢谢你的格式化! 我无法复制。 endElement 为我调用。添加日志记录。 【参考方案1】:

characters 所做的是在 XML 元素标记之间传递内容(以块的形式,每个方法调用一个块)。所以 如果你有一个像

这样的 XML 元素
<Foo someattrib=“” />

然后characters 不会被调用,因为那里没有可供解析器告诉您的内容。

如果你依赖你的 characters 方法,即使标签是空的,也必须在这里调用,你做错了

characters 方法将元素文本添加到缓冲区,但 startElement 和 endElement 需要负责从缓冲区中清除和读取,因为 endElement 是您知道已收到所有元素文本的地方。如果没有可读取的内容,应该可以不调用字符。

因为您可能还没有在任何一个字符调用中获得所有内容该方法中不能有任何业务逻辑。如果有,那么您的代码在某些时候将无法工作。

有关如何实现字符,请参阅this example。如果您要做的是读取属性值,请参阅this example。

【讨论】:

你能弄清楚如何解析这个吗?我在解析相同类型的 xml 文档时遇到了同样的困难。 @Rudy:添加了更多解释并链接到我写的其他答案中的示例。

以上是关于使用 SAX 解析器解析自关闭 XML 标记时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

DOM、SAX 和 StAX XML 解析器之间有啥区别? [关闭]

XML

解析XML文件之使用SAM解析器

当我需要 DocumentBuilder 时使用 SAX 解析器

python使用SAX解析xml

在BlackBerry中使用SAX解析器解析XML