问题描述
最好的解决方案是使用XPath。您的pastebin已过期,但这是我收集的内容。假设我们有以下Feed.xml
文件:
<?xml version="1.0" encoding="UTF-8" ?>
<entries>
<entry>
<title>Feed TITLE 1</title>
<id>id1</id>
<tempi type="type1">
<conento xmlns="dontcare?" madeIn="MadeIn1" />
</tempi>
</entry>
<entry>
<title>Feed TITLE 2</title>
<id>id2</id>
<tempi type="type2">
<conento xmlns="dontcare?" madeIn="MadeIn2" />
</tempi>
</entry>
<entry>
<id>id3</id>
</entry>
</entries>
这是一个简短但可编译且可运行的概念证明(Feed.xml
文件位于同一目录中)。
import javax.xml.xpath.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import java.util.*;
public class XPathTest {
static class Entry {
final String title, id, origin, type;
Entry(String title, String id, String origin, String type) {
this.title = title;
this.id = id;
this.origin = origin;
this.type = type;
}
@Override public String toString() {
return String.format("%s:%s(%s)[%s]", id, title, origin, type);
}
}
final static XPath xpath = XPathFactory.newInstance().newXPath();
static String evalString(Node context, String path) throws XPathExpressionException {
return (String) xpath.evaluate(path, context, XPathConstants.STRING);
}
public static void main(String[] args) throws Exception {
File file = new File("Feed.xml");
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
NodeList entriesNodeList = (NodeList) xpath.evaluate("//entry", document, XPathConstants.NODESET);
List<Entry> entries = new ArrayList<Entry>();
for (int i = 0; i < entriesNodeList.getLength(); i++) {
Node entryNode = entriesNodeList.item(i);
entries.add(new Entry(
evalString(entryNode, "title"),
evalString(entryNode, "id"),
evalString(entryNode, "tempi/conento/@madeIn"),
evalString(entryNode, "tempi/@type")
));
}
for (Entry entry : entries) {
System.out.println(entry);
}
}
}
这将产生以下输出:
id1:Feed TITLE 1(MadeIn1)[type1]
id2:Feed TITLE 2(MadeIn2)[type2]
id3:()[]
请注意,使用XPath如何使值检索变得非常简单,直观,易读和直接,并且“丢失”值也得到了很好的处理。
API链接
解决方法
我正在尝试读取xml文件,例如:
<entry>
<title>FEED TITLE</title>
<id>5467sdad98787ad3149878sasda</id>
<tempi type="application/xml">
<conento xmlns="http://mydomainname.com/xsd/radiofeed.xsd" madeIn="USA" />
</tempi>
</entry>
这是我到目前为止的代码:
这是我尝试编写此代码的尝试,怎么说都不成功,这就是我开始赏金的原因。这是http://pastebin.com/huKP4KED。
赏金更新:
我确实真的尝试了好几天,但现在没想到会这么难,我会接受有用的链接/书籍/教程,但更喜欢代码,因为我昨天需要这样做。
这是我需要的:
关于上面的xml:
- 我需要获取标题ID的值
- tempi的属性值以及contento的madeIn属性值
做这个的最好方式是什么 ?
编辑:
@帕斯卡尔·蒂文(Pascal Thivent)
也许创建方法将是一个好主意,例如public String getValue(String xml,Element
elementname),在其中指定标签名称,如果该值不可用,则该方法返回标签值或标签属性(也许将其名称作为附加方法参数)
如果标签值不可用,我真正想要获得的标签值或属性是什么,所以我正在考虑最好的方法是什么,因为我从未做过