XML子节点属性值

我正在尝试读取xml文件,例如:

 FEED TITLE 5467sdad98787ad3149878sasda     

这是我到目前为止的代码:

这是我试图编写这个代码的尝试,说什么不成功,这就是为什么我开始赏金。 这是http://pastebin.com/huKP4KED 。

赏金更新:

我真的真的试图这样做几天现在没想到会这么难,我会接受有用的链接/书籍/教程,但更喜欢代码,因为我昨天需要这样做。

这就是我需要的:

关于上面的xml:

  • 我需要获得title,id的价值
  • tempi的属性值以及contento的madeIn属性值

做这个的最好方式是什么 ?

编辑:

@Pascal Thivent

也许创建方法是个好主意,比如public String getValue(String xml,Element elementname),你指定标签名称,方法返回标签值或标签属性(如果值不可用,可能会将其命名为附加方法参数)

如果标签值不可用,我真的想要获得某些标签值或属性,所以我正在考虑这样做的最佳方法是什么,因为我以前从未这样做过

对此最好的解决方案是使用XPath。 你的pastebin过期了,但这就是我收集的内容。 假设我们有以下feed.xml文件:

    FEED TITLE 1 id1      FEED TITLE 2 id2      id3   

这是一个简短但可编译且可运行的概念validation(在同一目录中使用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 entries = new ArrayList(); 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链接

使用Element.getAttribute和Element.setAttribute

在您的示例中, ((Node) content.item(0)).getFirstChild().getAttributes() 。 假设content是拼写错误,你的意思是contento ,getFirstChild正确地返回NULL,因为contento没有子节点。 尝试: ((Node) contento.item(0)).getAttributes()代替。

另一个问题是,通过使用getFirstChildgetChildNodes()[0]而不检查返回值,您将面临拾取子文本节点而不是所需元素的风险。

正如所指出的, 没有任何孩子,而不是:

 (contento.item(0)).getFirstChild().getAttributes() 

您应该将Node视为Element并使用getAttribute(String),如下所示:

 ((Element)contento.item(0)).getAttribute("madeIn") 

这是您的代码的修改版本(它不是我编写的最强大的代码):

 InputStream inputStream = new ByteArrayInputStream(xml.getBytes()); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(inputStream); doc.getDocumentElement().normalize(); System.out.println("Root element " + doc.getDocumentElement().getNodeName()); NodeList nodeLst = doc.getElementsByTagName("entry"); System.out.println("Information of all entries"); for (int s = 0; s < nodeLst.getLength(); s++) { Node fstNode = nodeLst.item(s); if (fstNode.getNodeType() == Node.ELEMENT_NODE) { Element fstElmnt = (Element) fstNode; NodeList title = fstElmnt.getElementsByTagName("title").item(0).getChildNodes(); System.out.println("Title : " + (title.item(0)).getNodeValue()); NodeList id = fstElmnt.getElementsByTagName("id").item(0).getChildNodes(); System.out.println("Id: " + (id.item(0)).getNodeValue()); Node tempiNode = fstElmnt.getElementsByTagName("tempi").item(0); System.out.println("Type : " + ((Element) tempiNode).getAttribute("type")); Node contento = tempiNode.getChildNodes().item(0); System.out.println("Made in : " + ((Element) contento).getAttribute("madeIn")); } } 

在XML片段上运行它会产生以下输出:

根元素条目
所有条目的信息
标题:饲料标题
 Id:5467sdad98787ad3149878sasda
输入:application / xml
美国制造

顺便问一下,你是否考虑过使用像罗马这样的东西?