Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XML子节点属性值_Java_Xml - Fatal编程技术网

Java XML子节点属性值

Java XML子节点属性值,java,xml,Java,Xml,我正在尝试读取xml文件,例如: <entry> <title>FEED TITLE</title> <id>5467sdad98787ad3149878sasda</id> <tempi type="application/xml"> <conento xmlns="http://mydomainname.com/xsd/radiofeed.xsd" madeIn="USA" /&

我正在尝试读取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>

提要标题
5467sdad98787ad3149878sasda
以下是我目前掌握的代码:

这是我试图编写的代码,说什么不成功,这就是我开始赏金的原因。给你

赏金更新:

我真的尝试了好几天了,没想到会这么难,我会接受有用的链接/书籍/教程,但更喜欢代码,因为我需要在昨天完成

以下是我需要的:

关于上述xml:

  • 我需要得到标题的值,id
  • tempi的属性值以及contento的madeIn属性值
最好的方法是什么

编辑:

@帕斯卡Thivent

也许创建方法会是个好主意,比如公共字符串getValue(String xml,Element elementname),在其中指定标记名,如果值不可用,该方法将返回标记值或标记属性(可能将其命名为附加方法参数)

如果标记值不可用,我真正想要的是获得特定的标记值或属性,因此我正在考虑最好的方法是什么,因为我以前从未使用和元素.setAttribute

在您的示例中,
((节点)content.item(0)).getFirstChild().getAttributes()
。假设
content
是一个输入错误,您的意思是
contento
,getFirstChild正确地返回NULL,因为contento没有子项。请尝试:
((节点)contento.item(0)).getAttributes()

另一个问题是,如果在不检查返回值的情况下使用
getFirstChild
getChildNodes()[0]
,则可能会拾取子文本节点,而不是所需的元素。

如前所述,
没有任何子节点,因此:

(contento.item(0)).getFirstChild().getAttributes()
您应该将节点视为元素并使用getAttribute(String),如下所示:

((Element)contento.item(0)).getAttribute("madeIn")
下面是代码的修改版本(这不是我编写的最健壮的代码):

InputStream InputStream=newbytearrayinputstream(xml.getBytes());
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
文档doc=db.parse(inputStream);
doc.getDocumentElement().normalize();
System.out.println(“根元素”+doc.getDocumentElement().getNodeName());
NodeList nodeLst=doc.getElementsByTagName(“条目”);
System.out.println(“所有条目的信息”);
对于(int s=0;s
在XML代码段上运行它会产生以下输出:

Root element entry Information of all entries Title : FEED TITLE Id: 5467sdad98787ad3149878sasda Type : application/xml Made in : USA
id1:FEED TITLE 1(MadeIn1)[type1]
id2:FEED TITLE 2(MadeIn2)[type2]
id3:()[]
根元素条目 所有参赛作品的资料 标题:提要标题 Id:5467sdad98787ad3149878sasda 类型:application/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>
这将产生以下输出:

Root element entry Information of all entries Title : FEED TITLE Id: 5467sdad98787ad3149878sasda Type : application/xml Made in : USA
id1:FEED TITLE 1(MadeIn1)[type1]
id2:FEED TITLE 2(MadeIn2)[type2]
id3:()[]
请注意,使用XPath如何使值检索变得非常简单、直观、可读和直接,并且“缺失”值也得到了优雅的处理

API链接

谢谢您的回答,
((Node)contento.item(0)).getAttributes()返回null,在这种情况下,您几乎肯定会选择子文本节点。尝试
((Node)contento.item(1)).getAttributes()
,如果成功,则重构它以使您的意图更清晰(可能使用getNodeType)。@Pascal Thivent我确实查看了rome,我从另一个方法获得了xml作为字符串。在罗马这样做会更好吗?有没有可能创造出比这更通用的东西?我的意思是这是一般的做法吗+1为什么要执行
getAttributes()。项(0)
?如果xml元素曾经交换过其属性的位置,那么这将导致错误的属性
node.getAttribute('madeIn')
似乎很好…@seanmonstar它确实很好,是的,这就是我说的“更通用”的意思@c0mrade:
String
不是问题,Rome可以接受
InputStream
。我至少想提一下,因为我认为罗马是分析/聚合/生成提要的事实上的标准,它提供了一个干净整洁的API。根据您的具体操作,Rome可能确实是标准选择。此外,请记住,属性的顺序在XML中并不重要-处理器可以有效地以任何顺序返回属性列表。@我在这里看到了这种方法,但不确定如何实现它。所以建议我创建一个带有title、id、tempi字段的Entry类?我不明白我该如何使用它而不是映射,以及如何使用这种方法获取标记属性?@c0mrade:问题是如何表示数据,而不是如何获取它们。您仍然可以使用XPath获取值,正如我上面所示,但是您不需要将它们存储到
映射中,而是希望使用一个
类条目
,该条目具有
getId()
getTitle()
getCou