Java XML子节点属性值
我正在尝试读取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" /&
<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属性值
((节点)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