我有一个类似于此的在线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文档就像预测一样,因此其他标签的日期和内容将始终在变化。
答案 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;
}
}
如果你想收集其他数据,它当然会更复杂,你会收集除字符串列表之外的东西,但这应该给出基本的想法。