我构建了一个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和命名空间
答案 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>