我有一个用Java解析的xml文档作为w3c文档。
在我的xml中,我有许多相同名称的元素,例如<item ..... />
,每个元素都具有唯一属性的值,例如<item name="a" .... />
。
我想在java中做:
doc.getElementById("a")
为了获得具有该名称的特定项目。 我怎么能告诉java使用'name'作为id? 或者,或者,如何以最低的复杂度获取特定项目?
答案 0 :(得分:3)
DOM不是最好的API,可以轻松查询您的文档并找回找到的元素。学习XPath,这是一个更合适的API,或者自己遍历元素树。
getElementById()
只返回具有给定id
属性的元素(编辑:在文档DTD或模式中标记为)。它无法通过name
属性找到。
有关详细信息,请参阅Java XML DOM: how are id Attributes special?。
答案 1 :(得分:1)
您需要编写一个DTD,将您的属性定义为类型ID
。
答案 2 :(得分:1)
嗯,要做出完整的答案,我必须像所有人所说的那样使用DTD模式。 由于我的需求非常简单,我通过以下方式将其添加到我的xml中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ATTLIST item
name ID #REQUIRED
>
]>
<root> .... </root>
唯一需要知道的是,一旦你声明ATTLIST,我必须声明我的所有其余属性,因此,你需要添加IMPLIED:
some-attribute CDATA #IMPLIED
它表示some-attribute包含一些数据(也可以使用PCDATA用于解析的cdata),并暗示,这意味着它可以存在或不存在。没关系。
所以最终,它看起来像是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ATTLIST item
name ID #REQUIRED
some-attribute CDATA #IMPLIED
>
]>
<root> .... </root>
从Java方面来说,盲目地使用它,例如getElementById("some-name")
答案 3 :(得分:0)
要使doc.getElementById("a")
工作,您需要将XML更改为<item id="a" name="a" .... />
如果您无法更改XML,则可以使用XPath来检索此元素。