2012-03-13 4 views
1

XMLファイルで定義されているAndroidアプリのレイアウトを操作するPythonスクリプト(minidom付き)を作成しました。ウィジェットには、例えば、android名前空間の要素です:名前空間IDは存在するのか、XMLの観点からは、android:idとは何ですか?

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

android:id属性とその必要な形式@+id/...に注意してください。私はgetElementById()でその要素を選択する方法が見つかりませんでした。おそらく私はミニドムを知らないので、おそらくそれは私が深くXML名前空間を理解していないからです。

idは、ツリー内の要素を一意に識別する属性であることを覚えています。私は名前空間IDを見たことがないので、android:idは実際にはというIDではなく、ちょうどandroid名前空間にidと呼ばれる属性です。この場合、getElementByIdへの方法はありません。なぜなら、XML IDで動作するからです。現在、私はDOMを横断し、アンドロイドをご確認ください:私のターゲット要素を取得するためにid属性が、この技術は明らかにgetElementById直接

免責事項未満柔軟性のある:私は、XSLTの人が答えを知ることができると思うので、私は、XSLTでこれをタグ付けXMLと名前空間の操作に慣れているためです。

+0

常にいくつかのサンプル入力と望ましい出力XMLは本当に本当に助けになるでしょう。私はあなたが正しいと確信していますアンドロイドは名前空間ですが、XML文書の先頭にxmlns宣言があるかどうかを調べることでこれを確認することができます。 – Kevan

+0

'android' **は**名前空間ですが、間違いありません。問題は、名前空間でスコープされた 'id'という名前の属性を' getElementById'に使用できるかどうかです。ソースXML [here](http://developer.android.com/guide/topics/ui/declaring-layout.html)を見たい場合は – Raffaele

答えて

1

OKを与える - 私はあなたの助けになるかもしれ何か他のものを見つけました。どうやらそれはタイプ "ID"であることが記載されているかどうかにかかっています。それはどこで定義され、それに影響を与えることができますか?私は:-(を知っているが、DOMレベルで導入http://www.w3.org/TR/DOM-Level-2-Core/core.html

getElementByIdを2 から以下の抽出How to set element's id in Python's xml.dom.minidom?

参照をチェックしません。そのID ELEMENTIDで与えられる要素を返します。そのような要素がnullを返し、存在しない場合。 注:DOM実装には、どのタイプのIDであるかを示す情報が必要です。名前が "ID"の属性は、定義されていない限りIDタイプではありません。属性が型IDであるかどうかはわからないnullを返すと予想される

+0

したがって、xmlは 'id'データ型を定義しています。これはDOM実装がそれを認識して' getElementById'で利用できるようにします。私の実装は* minidom *であり、それを動作させる方法が見つかっていません – Raffaele

+0

リンクされた答えを正しく読んだら、SetIdAttributeを使って属性名をIDとして簡単に設定できます。 Minidom docを検索すると、minidomで利用できるSetIdAttributeNSもあり、属性名+名前空間をIDとして設定しているようです。それがあなたに役立つことを願っています。 – Maestro13

+0

それはチキンと卵の問題です: 'setIdAttribute'は[Element'](http://hg.python.org/cpython/file/3.2/Lib/xml/dom/minidom.py)のために定義されています。したがって、あなたは**最初の**要素を見つけなければならず、次に 'getElementById'で取り出すことができます。しかし、これはあまり役に立たないと思います。 – Raffaele

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> 

でわからない1が必要だろうか、その名前空間の属性を選択するための今

...いえため。 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が何を意味するのかに関する追加の意味情報が含まれています。 –

+0

申し訳ありませんが、私は本当にXSLTの例は必要ありません、私の質問はより理論的です(免責事項を参照してください)。 XMLにアクセスするための1つのAPIは、getElementByIdを定義するDOMです。これは特殊なxml 'id'属性で動作します。私は同じDOM関数が* namespaced * idにアクセスするために使用できるかどうか、それは多少特殊な属性にするのか、それとも普通の属性であればDOMをトラバースする必要があるのだろうか?(xsltで 'select =/@接頭辞:attr "') – Raffaele

+0

@DietrichEpp私は同意します。 xslスタイルシートヘッダーを除いて、私は多くの名前空間が使用されているとは思えません。非実験室の例を明確にしたいのですが、どこでこれらを見つけることができるでしょうか? – Maestro13

関連する問題