当前位置: 首页 > 面试题库 >

XML子节点属性值

訾渝
2023-03-14
问题内容

我正在尝试读取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),在其中指定标签名称,如果该值不可用,则该方法返回标签值或标签属性(也许将其名称作为附加方法参数)

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


问题答案:

最好的解决方案是使用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) html" target="_blank">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链接

  • package javax.xml.xpath
  • http://www.w3.org/TR/xpath
  • 维基百科/ XPath


 类似资料:
  • 我有一个像这样的xml结构 我需要选择ClassX节点,并在包含constname1(即variable1)AttAttribute的值中 这起作用了。但是,我需要做如下操作,而不是在循环中混合文本 这是我不对的 然而下面是正确的 但我希望将选择范围限制为classX的节点

  • 嗨,下面是我的XML文件。 上面的XML文件包含父根作为打印,子节点作为一部分。我想在C#中读取子节点及其属性。若XML文件包含唯一的节点名,那个么我可以读取它们。但如果所有子节点都包含相同的节点名,那么我们如何读取它们呢。

  • 如何能够基于另一个同级节点的属性选择节点属性?我想要实现的是从所有节点中提取链接(href值),这些节点后跟具有属性class=“body table news loss”的节点跨度,即选择器应该返回https://finance.yahoo.com/news/inspiremd-announces-planned-recapitalization-120000752.html在下面的示例中。我试

  • 我想递归地连接一个节点的参数值和它的父节点的相同参数值。 例如,如下: 应该成为 我试过了 有什么问题吗?

  • 这似乎是一个相当简单的问题,但我已经为此绞尽脑汁好几个小时了。我有一个类似于下面的节点结构: 我需要从子节点收集三种类型的属性:一种是字符串、布尔值和字符串数组。我认为下面的sql2查询可以工作并获得它们的属性,但无论出于什么原因,我都会得到一个错误: 查询 错误: 感谢您的帮助,因为我已经在这几天了。

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前