2012-10-14 123 views
0

我有一個XML文件,網上類似這樣的:如何解析第二個XML標籤?

<example> 
    <date>2012-10-13</date> 
    <bob>What I already know how to get</bob> 
</example> 
<example> 
    <date>2012-10-14</date> 
    <bob>What I want as well as the above</bob> 
</example> 

下面是我用得到的「我已經知道如何得到」標籤的數據內容:

/** 
* Gets be called on opening tags like: <tag> Can provide attribute(s), when 
* xml was like: <tag attribute="attributeValue"> 
*/ 
@Override 
public void startElement(String namespaceURI, String localName, 
     String qName, Attributes atts) throws SAXException { 
    if (localName.equals("example")) { 
     this.in_example = true; 
    } else if (localName.equals("bob")) { 
     this.in_bob = true; 
    } 
} 

/** 
* Gets be called on closing tags like: </tag> 
*/ 
@Override 
public void endElement(String namespaceURI, String localName, String qName) 
     throws SAXException { 
    if (localName.equals("example")) { 
     this.in_example = false; 
    } else if (localName.equals("bob")) { 
     this.in_bob = false; 
    } 
} 

/** 
* Gets be called on the following structure: <tag>characters</tag> 
*/ 
@Override 
public void characters(char ch[], int start, int length) { 
    if (this.in_bob) { 
        // A custom DataParser 
     myDataParser.setExtractedString(new String(ch, start, length)); 
    } 
} 

好,所以這裏有個問題......即使它包含了類似於「我已經知道如何獲得的東西」的標籤,我怎樣才能得到「我想要的和上面一樣」?

在此先感謝:)

N.B. XML文檔就像預測一樣,所以其他標籤的日期和內容將始終在變化。

+0

你試過用dom解析器嗎? – Raghunandan

回答

0

您可以將答案添加到的Strings一個List

修改最後的功能,例如:

List<String> results = new ArrayList<String>(); 

/** 
* Gets be called on the following structure: <tag>characters</tag> 
*/ 
@Override 
public void characters(char ch[], int start, int length) { 
    if (this.in_bob) { 
        // A custom DataParser 
     results.add(new String(ch, start, length)); 
    } 
} 

後您完成通過XML走,只是解析收集Strings

1

如果您的文件在頂層包含兩個<example>元素,那麼它不是一個格式良好的XML文檔,所以當您嘗試解析XML文檔時,XML解析器總是會失敗。

然而它是一個良好的XML外部實體,所以可以通過將其包括到使用實體引用一個良好的XML文檔解析它。

0

正如邁克爾·凱指出,如該文件是不是有效的XML。

因爲你似乎已經能夠解析並獲得的第一個值,我認爲它實際上只是一個更大的文檔的一部分。

如果你想收集更多的元素的數據,你需要收集到像列表的結構,而不是隻是一個字符串,並在創建在該列表中的新條目適當控制。

characters方法不與解析器挺你似乎認爲的方式工作。解析器可以多次調用單個標籤內的內容。您不需要一次獲得全部數據,您需要將數據收集到一個緩衝區中,並且只在調用endElement時預期它會完成。

對於只收集「鮑勃」的數據轉換爲字符串列表,下面會做什麼:

public class ExampleHandler extends DefaultHandler { 

    private List<String> results = new ArrayList<String>(); 
    private StringBuilder builder = new StringBuilder(); 

    @Override 
    public void startElement(String namespaceURI, String localName, 
          String qName, Attributes atts) throws SAXException { 
     if (localName.equals("bob")) { 
      builder.setLength(0); 
     } 
    } 

    @Override 
    public void endElement(String namespaceURI, String localName, String qName) 
      throws SAXException { 
     if (localName.equals("bob")) { 
      results.add(builder.toString()); 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) { 
     builder.append(ch, start, length); 
    } 

    public List<String> getResults() { 
     return results; 
    } 
} 

如果您要收集的其他數據還有,當然會更復雜,你會收集到一些字符串列表以外的東西,但這應該給出基本的想法。