0

我在网上有一个类似这样的 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));
    }
}

好的,问题来了……我怎样才能得到“我想要的以及上面的东西”,即使它包含在与“我已经知道如何得到的东西”类似的标签中?

提前致谢 :)

NB XML 文档就像一个预测,所以其他标签的日期和内容总是在变化的。

4

3 回答 3

1

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

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

于 2012-10-14T07:59:50.667 回答
0

您可以将答案添加到 a Listof Strings

修改最后一个函数如下:

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.

于 2012-10-14T00:47:52.407 回答
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;
    }
}

如果您还想收集其他数据,它当然会更复杂,并且您将收集到字符串列表以外的其他数据,但这应该给出基本概念。

于 2012-10-14T22:14:59.753 回答