从XML的角度来看,命名空间id是存在还是什么是android:id?

时间:2012-03-13 17:27:09

标签: android python xml xslt dom

我构建了一个Python脚本(使用minidom)来操作Android应用程序的布局,该应用程序在XML文件中定义。窗口小部件是android命名空间中的元素,例如:

<TextView android:id="@+id/myId" android:text="..." />

请注意android:id属性及其所需格式@+id/...。我找不到用getElementById()选择该元素的方法。也许是因为我不知道minidom,但更可能是因为我不深入理解XML命名空间。

我记得id是唯一标识树中元素的属性。我从未见过命名空间ID,所以我的猜测是android:id 实际上不是ID ,而只是{{1}中恰好称为id的属性命名空间。在这种情况下,没有办法android,因为它适用于XML id。目前我遍历dom并检查android:id属性以获取我的目标元素,但这种技术明显不如getElementById直接

免责声明:我用xslt对此进行了标记,因为我认为xslt用户可以知道答案,因为他们习惯使用XML和命名空间

2 个答案:

答案 0 :(得分:1)

好的 - 我找到了一些可能对你有帮助的东西。显然它取决于列出的“ID”类型。定义在哪里,你能影响它吗?我不知道:-(但请检查How to set element's id in Python's xml.dom.minidom?

请参阅以下http://www.w3.org/TR/DOM-Level-2-Core/core.html

中的摘录 在DOM Level 2中引入了

getElementById 返回其ID由elementId指定的Element。如果不存在此类元素,则返回null。如果多个元素具有此ID,则不会定义行为。  注意:DOM实现必须具有说明哪些属性属于ID类型的信息。除非如此定义,否则名称为“ID”的属性不是ID类型。不知道属性是否为ID类型的实现应返回null。

答案 1 :(得分:0)

是的,属性可以有名称空间。属性名称空间的最着名的示例是名称空间声明本身:

xmlns:someNamespace="someUri"

使用我看到的命名空间的唯一优势是,当分配了不同的命名空间时,可以多次使用相同的属性名称,例如在

<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.my.org" >
  <good n1:a="1"  n2:a="2" />
</x>

虽然不确定人们需要什么...

现在选择命名空间属性。 在XSLT / Xpath中,这是以正常方式完成的,包括命名空间当然;不要忘记@字符。上述XML的示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:n1="http://www.w3.org"
    xmlns:n2="http://www.my.org">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="//good">
        <root>
            <n1><xsl:value-of select="./@n1:a"/></n1>
            <n2><xsl:value-of select="./@n2:a"/></n2>
        </root>
    </xsl:template>
</xsl:stylesheet>

给出

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:n1="http://www.w3.org" xmlns:n2="http://www.my.org">
    <n1>1</n1>
    <n2>2</n2>
</root>