如何解析第二个XML标记?

时间:2012-10-14 00:20:19

标签: android xml xml-parsing

我有一个类似于此的在线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>

这是我用来获取&#34;我已经知道如何获得的数据&#34;标记:

/**
 * 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));
    }
}

好的,这就是问题......我怎样才能得到&#34;我想要的以及上面的&#34;,即使它被包含在&#的类似标签中34;我已经知道如何获得&#34;?

提前致谢:)

N.B。 XML文档就像预测一样,因此其他标签的日期和内容将始终在变化。

3 个答案:

答案 0 :(得分:1)

如果您的文件在顶层包含两个<example>元素,那么它不是格式良好的XML文档,因此当您尝试解析它时,XML解析器总是会给您失败。

它是一个格式良好的XML外部实体,因此您可以通过使用实体引用将其包含在格式良好的XML文档中来解析它。

答案 1 :(得分:0)

您可以将答案添加到List的{​​{1}}。

修改最后一个函数:

Strings

完成浏览xml之后,只需解析收集的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)); } }

答案 2 :(得分:0)

正如Michael Kay所说,所显示的文档不是有效的XML。

由于您似乎能够解析并获得第一个值,我认为它实际上只是更大文档的一部分。

如果要从更多元素中收集数据,则需要收集到类似列表的结构而不仅仅是字符串,并在该列表中创建新条目时正确控制。

characters方法与解析器的工作方式完全不同。解析器可以为单个标记内的内容多次调用它。您需要将数据收集到缓冲区中,而不是期望一次性完成所有操作,而只需要在调用endElement时完成它。

为了仅将“bob”数据收集到字符串列表中,以下内容将执行:

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;
    }
}

如果你想收集其他数据,它当然会更复杂,你会收集除字符串列表之外的东西,但这应该给出基本的想法。