2012-03-13 35 views
1

我構建了一個Python腳本(帶有minidom)來操縱Android應用程序的佈局,該應用程序在XML文件中定義。窗口小部件是在android命名空間的元素,例如:從XML的角度來看,名稱空間ID是存在的還是什麼是android:id?

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

注意android:id屬性及其所需的格式@+id/...。我沒有找到一種方法來選擇getElementById()。也許這是因爲我不知道minidom,但更可能是因爲我不太瞭解XML命名空間。

我記得id是唯一標識樹中元素的屬性。我從來沒有看到命名空間ID,所以我猜想android:id並非真正的ID,而是android命名空間中恰好被稱爲id的屬性。在這種情況下,無法getElementById,因爲它適用於XML標識。目前我遍歷DOM,並檢查了android:id屬性,讓我的目標元素,但這種技術明顯比getElementById不夠靈活直接

聲明:我標記此使用XSLT,因爲我認爲XSLT人能知道答案因爲它們習慣於使用XML和命名空間

+0

一如既往的一些樣本輸入和所需的輸出XML真的會有幫助。我懷疑你是正確的,android是一個命名空間,但你應該能夠通過查看XML文檔的開頭是否存在xmlns聲明來檢查。 – Kevan 2012-03-13 20:30:26

+0

'android' **是**的命名空間,毫無疑問。問題是如果名稱空間中名爲'id'的屬性可以用於'getElementById'。如果你想看到一個源XML [這裏](http://developer.android.com/guide/topics/ui/declaring-layout.html)是一些 – Raffaele 2012-03-13 20:46:31

回答

1

行 - 我發現別的東西,可能會幫上你。顯然這取決於所列舉的「ID」類型。定義在哪裏,你能影響它嗎?我不知道:-(但檢查How to set element's id in Python's xml.dom.minidom?

看到DOM級別2中引入http://www.w3.org/TR/DOM-Level-2-Core/core.html

下面的getElementById提取 返回其ID由elementId給出。如果沒有這樣的元素存在,返回null元素。如果多個元素具有此ID,則不定義行爲 注意:DOM實現必須具有說明哪些屬性是ID類型的信息,具有名稱「ID」的屬性不具有類型ID,除非如此定義。不知道是否屬性的類型ID是否應該返回null

+0

因此,xml定義了一個'id'數據類型,由DOM實現識別並通過'getElementById'使其可用。我的實現是* minidom *,並且我還沒有找到讓它工作的方法 – Raffaele 2012-03-13 22:45:33

+0

如果我正確讀取鏈接的答案,則可以使用SetIdAttribute輕鬆地將屬性名稱設置爲ID。再看一下,搜索minidom文檔,我發現在minidom中也有一個SetIdAttributeNS可用,它似乎將屬性名稱+名稱空間設置爲ID。我希望這對你有用。 – Maestro13 2012-03-13 22:57:41

+0

這是一個雞和雞蛋的問題:''setIdAttribute'是爲['Element']定義的(http://hg.python.org/cpython/file/3.2/Lib/xml/dom/minidom.py),不適用於Document ,所以你必須首先找到元素**,然後可以用'getElementById'來檢索。但我想這不是非常有用:) – Raffaele 2012-03-14 00:30:04

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> 
+0

你錯誤地認爲避免衝突是命名空間的唯一目的。屬性名稱空間允許您將屬性從一個名稱空間插入到任何任意名稱空間的文檔中;所以對於命名空間,我可以將'xlink:href'放入任何文檔中,並且可以將任何節點標記爲'xml:lang =「en」',但沒有名稱空間我不能這樣做 - 我可以將'href = 「...」或「lang =」en「'但其含義可能完全不同。 xlink的命名空間攜帶關於「xlink:href」含義的附加語義信息。 – 2012-03-13 21:11:34

+0

對不起,我真的不需要XSLT的例子,我的問題更具理論性(參見免責聲明)。訪問XML的一個API是定義'getElementById'的DOM。這適用於特殊的xml'id'屬性。我想知道是否可以使用同一個DOM函數來訪問一個* namespaced * id,使它成爲一個特殊的屬性,或者它是一個普通的屬性,並且需要遍歷DOM(在xslt中通過'select =「完成。/@前綴:attr「') – Raffaele 2012-03-13 21:20:37

+0

@DietrichEpp我同意。只是除了xsl樣式表頭之外,我沒有看到那麼多的命名空間被使用 - 我希望看到一些澄清的非實驗性的例子,你知道我能在哪裏找到這些嗎? – Maestro13 2012-03-13 21:22:18

相關問題