2017-10-24 14 views
0

と大文字または小文字にselectnodeが鈍感な作り名前は大文字と小文字に区別されないmyfile:boOkSまたはmyfile:BOOKSですか?は、私は、次のXMLを持っている名前空間

もう1つの質問は私のnamespaceManagerですか?もっとシンプルにできますか?

+0

例ノードが好きなら、 OR すべてのケースでうまくいきたいです –

答えて

0

local-name()およびnamespace-uri()関数を使用して、XPathクエリで要素名と名前空間を返し、次にtranslate()関数を使用してローカル名を小文字にすることができます。

したがって、次の作業をする必要があります:.Net fiddle作業

var elementName = "books"; // Or whatever 
var nameSpaceUri = el.OwnerDocument.DocumentElement.NamespaceURI; 
var xpathQuery = string.Format(@"/myfile:bookstore/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='{0}' and namespace-uri()='{1}']", elementName, nameSpaceUri); 
var node = el.SelectSingleNode(xpathQuery, nsmgr); 

サンプルを。

この場合、name()関数の戻り値を小文字にすることは避けてください。例えば。次の操作を行うように誘惑されることがあります。

var node = el.SelectSingleNode(@"/myfile:bookstore/*[translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'myfile:books']", nsmgr); 

それはリテラル'myfile:books'文字列内の名前空間接頭辞myfile:をハードコードしかし、このを使用すべきではありません。後で入力XMLは異なる接頭辞を使用するように変更された場合 - など、またはまったく接頭辞:

<bookstore xmlns="http://MyRootNameSpace"> 
    <Books> 
    <Book> Book 1</Book> 
    <Book> Book 2</Book> 
    </Books> 
</bookstore> 

その後、あなたのXPathクエリは、新しいXMLが古いと意味的に同じであるという事実にもかかわらず破ります。

+0

パーフェクト!ありがとうございました! –

+0

@ E.Hayes - 喜んで助けてください。質問に答えるには、[それをそのままとしてください](https://meta.stackexchange.com/questions/147531/how-mark-my-question-as-answered-on-stackoverflow)してください。 – dbc

+0

どうすればわかるのですか –

関連する問題