2009-08-18 10 views
1

나는 혼란스러워하는 XML 문서가 있습니다. 나는 (시작하기 위해) 모든 문서 노드 (/ database/document)를 가져오고 싶지만 데이터베이스 요소의 모든 속성을 제거하는 경우에만 작동합니다. 특히 xmlns 태그는/database/document에 대한 xpath 쿼리가 아무 것도 반환하지 않도록합니다. 제거하면 제거되고 작동합니다.XML 네임 스페이스가 나를 혼란스럽게합니다

xmlns="http://www.lotus.com/dxl" 

나는 XML 네임 스페이스와 관련이있다. 그것이 무엇을하고 있으며, 더 중요한 것은 어떻게 멈추게할까요? 난 그냥 데이터에 대한 문서를 구문 분석 싶어요.

<?xml version="1.0" encoding="utf-8"?> 
<database xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.lotus.com/dxl xmlschemas/domino_7_0_3.xsd" 
      xmlns="http://www.lotus.com/dxl" 
      version="7.0" 
      maintenanceversion="3.0" 
      path="C:\LotusXML\test1.nsf" 
      title="test1"> 
    <databaseinfo numberofdocuments="3"> 
    <datamodified> 
     <datetime dst="true">20090812T142141,48-04</datetime> 
    </datamodified> 
    <designmodified> 
     <datetime dst="true">20090812T154850,91-04</datetime> 
    </designmodified> 
    </databaseinfo> 
    <document form="NameAddress"> 
    <noteinfo noteid="8fa" unid="x" sequence="2"> 
     <created> 
     <datetime dst="true">20090812T130308,71-04</datetime> 
     </created> 
     <modified> 
     <datetime dst="true">20090812T142049,36-04</datetime> 
     </modified> 
     <revised> 
     <datetime dst="true">20090812T142049,35-04</datetime> 
     </revised> 
     <lastaccessed> 
     <datetime dst="true">20090812T142049,35-04</datetime> 
     </lastaccessed> 
     <addedtofile> 
     <datetime dst="true">20090812T130321,57-04</datetime> 
     </addedtofile> 
    </noteinfo> 
    <updatedby> 
     <name>MOOSE</name> 
    </updatedby> 
    <revisions> 
     <datetime dst="true">20090812T130321,57-04</datetime> 
    </revisions> 
    <item name="Name"> 
     <text>joe</text> 
    </item> 
    <item name="OtherName"> 
     <text>dave</text> 
    </item> 
    <item name="Address"> 
     <text>here at home</text> 
    </item> 
    <item name="PictureHere"> 
     <richtext> 
     <pardef id="1" /> 
     <par def="1"> 
     </par> 
     <par def="1" /> 
     </richtext> 
    </item> 
    </document> 
    <document form="NameAddress"> 
    <noteinfo noteid="8fe" unid="x" sequence="2"> 
     <created> 
     <datetime dst="true">20090812T130324,59-04</datetime> 
     </created> 
     <modified> 
     <datetime dst="true">20090812T142116,95-04</datetime> 
     </modified> 
     <revised> 
     <datetime dst="true">20090812T142116,94-04</datetime> 
     </revised> 
     <lastaccessed> 
     <datetime dst="true">20090812T142116,94-04</datetime> 
     </lastaccessed> 
     <addedtofile> 
     <datetime dst="true">20090812T130333,90-04</datetime> 
     </addedtofile> 
    </noteinfo> 
    <updatedby> 
     <name>MOOSE</name> 
    </updatedby> 
    <revisions> 
     <datetime dst="true">20090812T130333,90-04</datetime> 
    </revisions> 
    <item name="Name"> 
     <text>fred</text> 
    </item> 
    <item name="OtherName"> 
     <text>wilma</text> 
    </item> 
    <item name="Address"> 
     <text>bedrock</text> 
    </item> 
    <item name="PictureHere"> 
     <richtext> 
     <pardef id="1" /> 
     <par def="1"> 
     </par> 
     <par def="1" /> 
     </richtext> 
    </item> 
    </document> 
    <document form="NameAddress"> 
    <noteinfo noteid="902" unid="x" sequence="2"> 
     <created> 
     <datetime dst="true">20090812T130337,09-04</datetime> 
     </created> 
     <modified> 
     <datetime dst="true">20090812T142141,48-04</datetime> 
     </modified> 
     <revised> 
     <datetime dst="true">20090812T142141,47-04</datetime> 
     </revised> 
     <lastaccessed> 
     <datetime dst="true">20090812T142141,47-04</datetime> 
     </lastaccessed> 
     <addedtofile> 
     <datetime dst="true">20090812T130350,20-04</datetime> 
     </addedtofile> 
    </noteinfo> 
    <updatedby> 
     <name>MOOSE</name> 
    </updatedby> 
    <revisions> 
     <datetime dst="true">20090812T130350,20-04</datetime> 
    </revisions> 
    <item name="Name"> 
     <text>julie</text> 
    </item> 
    <item name="OtherName"> 
     <text>mccarthy</text> 
    </item> 
    <item name="Address"> 
     <text>the pen</text> 
    </item> 
    <item name="PictureHere"> 
     <richtext> 
     <pardef id="1" /> 
     <par def="1"> 
     </par> 
     <par def="1" /> 
     </richtext> 
    </item> 
    </document> 
</database> 

답변

7

xmlns="http://www.lotus.com/dxl"은 포함 된 노드의 기본 네임 스페이스를 설정합니다. /database/document이 실제로 /{http://www.lotus.com/dxl}:database/{http://www.lotus.com/dxl}:document임을 의미합니다. XPath 쿼리는 네임 스페이스를 포함해야합니다.

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
ns.AddNamespace("tns", "http://www.lotus.com/dxl"); 
var documents = doc.SelectNodes("/tns:database/tns:document", ns); 
+0

다섯 번째 줄에 읽어야한다고 들었습니다. var documents = doc.SelectNodes ("/ tns : database/tns : document", ns); – quillbreaker

+0

해결되었습니다. 감사. –

2

정의 된 XML 네임 스페이스가있는 경우 정확하게 인식하려면 각 요소 앞에 필요합니다. 이 데이터를 읽기 위해 XML에 LINQ를 사용한다면

는 다음과 같이 보일 것입니다 :

XDocument xdoc = XDocument.Load("file.xml"); 
XNamespace ns = "http://www.lotus.com/dxl"; 
var documents = xdoc.Descendants(ns + "document"); 

XML 네임 스페이스는 C#을 네임 스페이스 (또는 지원하는 다른 언어)에 대한 개념과 유사하다. 네임 스페이스 내부에 클래스를 정의하면 네임 스페이스를 먼저 지정하지 않고는 액세스 할 수 없습니다 (이것은 사용 문이 사용자를 대신합니다).

+0

그럼 세 개의 문서를 찾을 수있는 유효한 xPath 표현식은 무엇입니까? – quillbreaker

+0

/ns : database/ns : 네임 스페이스를 정의한 후 Jason의 LINQ to XML 응답은 위의 예에서 – MattH

+0

과 동일한 (또는 기능적으로 동일한) XPath 쿼리로 해결되며 'documents'변수 문서 XElements 모음을 포함합니다. 이를 반복하고 추가 LINQ 쿼리를 통해 필요한 데이터를 추출 할 수 있습니다. –

1

네임 스페이스를 포함하여 전체 이름으로 요소를 지정해야합니다. 이를 수행하는 쉬운 방법은 적절한 XNamespace를 정의하고 요소 이름 앞에 추가하는 것입니다.

XDocument myDoc; 
XNamespace ns = "http://www.lotus.com/dxl"; 
XElement myElem = myDoc.Element(ns + "ElementName"); 

자세한 내용은 MSDN을 참조하십시오.

관련 문제