2009-08-18 77 views
1

我有一個令我困惑的XML文檔。我想(開始)拉出所有的文檔節點(/數據庫/文檔),但它只適用於刪除數據庫元素上的所有屬性。具體來說,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 2009-08-18 13:35:15

+0

修正了它。謝謝。 – 2009-08-18 14:27:53

2

當定義了一個XML名稱空間時,每個元素都需要在它前面,以便它被正確識別。

如果你使用LINQ到XML在這個數據讀它會是這個樣子:

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

XML命名空間在概念上與C#命名空間(或支持任何其他語言)相似。如果你在一個名字空間中定義了一個類,你將無法在沒有指定名字空間的情況下訪問它(這是使用語句爲你做的)。

+0

那麼,哪些有效的xPath表達式可以找到這三個文檔? – quillbreaker 2009-08-18 13:14:20

+0

定義名稱空間 /ns:database/ns:document 這樣做,但Jason的LINQ to XML答案將解析爲上述示例中的相同(或功能上等效的)XPath查詢 – MattH 2009-08-18 13:17:30

+0

,'documents'變量將包含文檔XElements的集合。您可以迭代並通過其他LINQ查詢提取所需的數據。 – 2009-08-18 13:17:30

1

您需要指定元素的全名,包括名稱空間。實現這一點的簡單方法是定義適當的XNamespace並將其預先添加到元素名稱中。

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

查看MSDN瞭解更多信息。