我有一个混淆了我的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>
答案 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。