XML命名空间让我感到困惑

时间:2009-08-18 13:05:52

标签: c# xml

我有一个混淆了我的XML文档。我想(开始)拉出所有文档节点(/ database / document),但它只有在我删除数据库元素上的所有属性时才有效。特别是xmlns标记导致/ database / document的xpath查询没有返回任何内容 - 删除它,它可以工作。

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>

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

当定义了XML命名空间时,每个元素都需要在它之前才能被正确识别。

如果您使用LINQ to XML读取此数据,它将如下所示:

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

XML命名空间在概念上类似于C#命名空间(或任何其他支持它的语言)。如果在命名空间内定义一个类,则在没有先指定命名空间的情况下就无法访问它(这就是using语句为你做的事情)。

答案 2 :(得分:1)

您需要按其全名指定元素,包括命名空间。执行此操作的简单方法是定义适当的XNamespace并将其添加到元素名称之前。

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

有关详细信息,请参阅MSDN