XML子节点属性值

问题描述

最好的解决方案是使用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),在其中指定标签名称,如果该值不可用,则该方法返回标签值或标签属性(也许将其名称作为附加方法参数)

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