【问题标题】:Xml id attribute to work with Java's getElementById? [duplicate]XML id 属性与 Java 的 getElementById 一起使用? [复制]
【发布时间】:2013-11-24 14:20:54
【问题描述】:

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

doc.getElementById("a")

为了得到那个特定的项目,我在那里有那个名字。 我如何告诉java使用'name'作为id? 或者,或者,我怎样才能以最低复杂度获取特定项目?

【问题讨论】:

    标签: java xml dom xml-parsing


    【解决方案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")

    【讨论】:

    • 这本身似乎不起作用。我认为我们还需要定义元素名称。
    • @HRJ 对我来说完美无缺。您是使用嵌入在 xml 中的 dtd 架构还是将其放在不同的文件中?如果是第一个,它应该像我写的那样工作,如果是后者,那么你可能需要“导入”它。假设 xml 和 dtd 都在同一个文件夹中,请在 xml 文件的顶部尝试 &lt;!DOCTYPE root SYSTEM "mySchema.dtd"&gt;
    • 我嵌入了它。我得到的错误是(解释一下):html, body, p, elements not defined 您能否引用需要为 HTML/XHTML/XML 文档添加的确切 DTD?
    • @HRJ 我的 Xml 看起来如下&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!DOCTYPE root SYSTEM "DefaultItemsDefinitions.dtd"&gt;&lt;root&gt;&lt;item name="a" type="1"/&gt;&lt;/root&gt; 我的 dtd 架构是 &lt;!ATTLIST item name ID #REQUIRED type (string|link) "string" &gt; 两者都在同一个文件夹中,这允许我为我的 .dtd 架构中指定的内容执行 getElementById(..) ID。如果愿意,您可以将 &lt;!DOCTYPE root SYSTEM ...&gt; 替换为 dtd 模式的实际内容,这将是相同的。对我来说,我多次使用相同的架构,所以导入更方便和模块化
    【解决方案2】:

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

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

    详情请见Java XML DOM: how are id Attributes special?

    【讨论】:

    • 我尝试了以下 XML:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;root&gt;&lt;item id="a"&gt;......&lt;/item&gt;&lt;/root&gt;,但仍然为空。这是为什么呢?
    • 现在我很困惑。我真诚地认为 id 实际上是 ID 元素,但 javadoc 表明该属性仅在声明为 ID 属性时才被视为 ID 属性(我认为在 DTD 或模式中)。例如,请参阅webdesign.about.com/od/xml/a/aa061801a.htm。另见stackoverflow.com/questions/3423430/…
    • 谢谢。它确实让我从某个地方开始。但是,似乎很烦人,因为一旦我声明了一个 dtd 架构,这意味着我没有在架构中声明的任何属性都是无效的,不应该存在
    【解决方案3】:

    您需要编写一个DTD,将您的属性定义为ID 类型。

    【讨论】:

      【解决方案4】:

      为了使doc.getElementById("a") 工作,您需要将您的XML 更改为&lt;item id="a" name="a" .... /&gt;

      如果您无法更改 XML,您可以使用 XPath 检索此元素。

      【讨论】:

      • 我已经试过了,但是它返回 null
      • 你给item标签添加了id属性,getElementById方法返回null?
      • 是的,我真的不知道为什么。请参阅 JB Nizet 的答案,我在那里发布了 xml。
      • 正如 JB Nizet 建议的那样,您的 id 属性可能不被视为正确的 ID。你用什么解析器?
      • 是的,我添加了一个仅描述我的属性的小架构。
      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多