用于Java';什么是getElementById?

用于Java';什么是getElementById?,java,xml,dom,xml-parsing,Java,Xml,Dom,Xml Parsing,我有一个xml文档被Java解析为w3c文档。 在我的xml中,有许多同名元素,例如,每个元素都有唯一的属性值,例如。 我想在java中做: doc.getElementById("a") 为了得到那个特定的项目,我有那个名字。 如何告诉java使用“name”作为id? 或者,我如何以最小的复杂性获取特定项?为了使doc.getElementById(“a”)工作,您需要将XML更改为 如果不能更改XML,可以使用XPath检索此元素。DOM不是轻松查询文档并返回找到的元素的最佳API。学习

我有一个xml文档被Java解析为w3c文档。 在我的xml中,有许多同名元素,例如
,每个元素都有唯一的属性值,例如
。 我想在java中做:

doc.getElementById("a")
为了得到那个特定的项目,我有那个名字。 如何告诉java使用“name”作为id?
或者,我如何以最小的复杂性获取特定项?

为了使
doc.getElementById(“a”)
工作,您需要将XML更改为


如果不能更改XML,可以使用XPath检索此元素。

DOM不是轻松查询文档并返回找到的元素的最佳API。学习XPath,这是一个更合适的API,或者自己迭代元素树

getElementById()
将只返回具有给定
id
属性的元素(编辑:在文档DTD或架构中标记为这样)。它无法通过
名称
属性找到


有关详细信息,请参见。

您需要编写一个DTD,该DTD将属性定义为
ID
类型。好吧,为了给出完整的答案,我必须像大家所说的那样使用DTD模式。 由于我的需求非常简单,因此我以以下方式将其嵌入到xml中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ATTLIST item 
        name ID #REQUIRED
        >
]>
<root> .... </root>
它表示某个属性包含一些数据(也可以将PCDATA用于解析的cdata),并且是隐含的,这意味着它可以存在,也可以不存在。没关系

所以最终,它看起来会像:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ATTLIST item 
        name ID #REQUIRED
        some-attribute CDATA #IMPLIED
        >
]>
<root> .... </root>

.... 

从Java方面来说,只是盲目地使用它,例如我已经尝试过的
getElementById(“某个名称”)

,但是它返回null。您在item标记中添加了一个id属性,getElementById方法返回null?是的,我真的不知道为什么。查看JB Nizet的答案,我在那里发布了xml。正如JB Nizet所建议的,可能您的id属性不被认为是正确的id。您使用什么解析器?是的,我添加了一个仅描述我的属性的小模式。我尝试了以下xml:
,但仍然为空。为什么?现在我很困惑。我真诚地认为id实际上是id元素,但是javadoc指出,如果属性被声明为id属性,那么该属性只会被视为id属性(我认为是在DTD或模式中)。例如,见。另见,谢谢。这确实让我有了一个开始。然而,这似乎很烦人,因为一旦我声明了dtd模式,它就意味着我没有在模式中声明的任何属性都是无效的,并且不应该出现在那里,而这些属性本身似乎不起作用。我认为我们还需要定义元素名。@HRJ对我来说,它工作得非常完美。您是使用嵌入在xml中的dtd模式,还是将其放在不同的文件中?如果是第一个,它应该像我写的那样工作,如果是后一个,那么你可能需要“导入”它。假设xml和dtd都在同一个文件夹中,请在嵌入它的xml文件顶部尝试
。我得到的错误是(意译):
html,body,p,未定义的元素
你能引用需要为html/XHTML/XML文档添加的确切DTD吗?@HRJ我的XML看起来如下
我的DTD模式是
都在同一个文件夹中,这允许我执行
getElementById(…)
用于在my.dtd架构中指定为
ID
的内容。如果愿意,您可以用dtd模式的实际内容替换
,这将是相同的。对我来说,我多次使用相同的模式,因此导入它更方便、更模块化
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ATTLIST item 
        name ID #REQUIRED
        some-attribute CDATA #IMPLIED
        >
]>
<root> .... </root>