2012-06-07 36 views
1

示例XML:Java的SAX解析器起始元素沒有看到標籤

<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語句,但該系統輸出打印「事件」的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())); 
+0

這真的不是一個驚喜,是嗎? CDATA部分通常包含不符合XML格式或結構的文本,因此將被解析器忽略(意思是:它被認爲是純文本)。我沒有意識到改變這種標準化行爲的設置,但是因爲在你的情況下,CDATA部分基本上是另一個XML層次結構,我不明白你爲什麼不能將它委託給另一個SAX解析器實例。 –

回答

1

讀第一個回答here理解爲什麼它不能識別標籤開始。您可能應該使用元素中的文本運行另一個解析器。

+0

如何從URL數據中獲取字符串?我可以刪除cdata標籤並正常解析它。 – jmosesman

+0

如果您要刪除字符串,您將會完全掃描字符串數據。也會有一些字符串操作開銷 - 對象創作。但它的表現可能很小。 –

+0

刪除了<!CDATA [和]]>字符並運行解析器,它工作。謝謝你的幫助。 – jmosesman

0

而不是「localName」,請嘗試「qName」