2017-10-24 1 views
0

나는 다음과 같은 XML이 다음 <myfile:books> 노드를 선택하는만들기으로 selectNode는

<myfile:bookstore> 
<myfile:books> 
<myfile:book> Book 1</myfile:book> 
<myfile:book> Book 2</myfile:book> 
</myfile:books> 
</myfile:bookstore> 

그리고 다음 코드를 :

XmlNamespaceManager nsmgr = new 
XmlNamespaceManager(el.OwnerDocument.NameTable); 
nsmgr.AddNamespace("myfile", 
el.OwnerDocument.DocumentElement.NamespaceURI); 

var node = el.SelectSingleNode(@"/myfile:bookstore/myfile:books", nsmgr); 

노드 때까지이 일을하는 방법 이름이 대문자와 소문자에 영향을받지 않는 myfile:boOkS 또는 myfile:BOOKS입니까?

또 다른 질문은 내 네임 스페이스 관리자입니까? 더 간단 할 수 있을까요?

+0

예 : 원하는 노드가 다음과 같습니다. OR 모든 경우에 사용할 수 있습니다. –

답변

0

local-name()namespace-uri() 함수를 사용하면 XPath 쿼리에서 요소 이름과 네임 스페이스를 반환 한 다음 translate() 함수를 사용하여 로컬 이름을 소문자로 지정할 수 있습니다.

따라서 다음과 같은 작업을해야합니다 :

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); 

샘플 .Net fiddle 작업.

name() 함수의 반환 값을 낮추면이 같은 경우에는 피해야합니다. 예 : 당신은 다음을 수행 유혹 될 수 있습니다 그것은 'myfile:books' 문자열 리터럴 내부의 공간 접두사myfile:를 하드 코드 때문에

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

그러나,이 을 사용할 수 없습니다.
<bookstore xmlns="http://MyRootNameSpace"> 
    <Books> 
    <Book> Book 1</Book> 
    <Book> Book 2</Book> 
    </Books> 
</bookstore> 

이 그런 다음 XPath 쿼리는 새로운 XML 이전에 의미 동일하다는 사실에도 불구하고 휴식 것이 : 같은, 전혀 없거나 접두사 - 나중에 입력 XML은 다른 접두사를 사용하도록 수정 된 경우.

+0

Perfect! 고맙습니다! –

+0

@ E.Hayes - 기꺼이 도와 드리겠습니다. 질문에 대한 답변이 있으면 [그것을 그대로 표시하십시오] (https://meta.stackexchange.com/questions/147531/how-mark-my-question-as-answered-on-stackoverflow)하십시오. – dbc

+0

나는 어떻게하는지 모른다 –