如何使用xPath和XmlNamespaceManager

时间:2016-01-07 20:18:14

标签: xml sharepoint xpath

给出以下来自SharePoint的片段

<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
    <rs:data ItemCount="1">
        <z:row ows_ID="234" ows_MetaInfo="234;#" ows__ModerationStatus="0" ows__Level="1" ows_owshiddenversion="3" ows_UniqueId="234;#{94103987-5DD9-40DF-87B0-A13D76FA6875}" ows_FSObjType="234;#0" ows_Created="2010-06-25 14:28:22" ows_FileRef="234;#sites/dept/Lists/Office List/234_.000" />
    </rs:data>
</listitems>

我如何从ows_ID属性中获取值234?

我尝试了很多方法,以下是最新的尝试

    [TestMethod]
    public void TestMethod6()
    {
        var xml = File.ReadAllText("OfficeQuery-Sharepoint.xml");
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);

        var officeId = doc.SelectSingleNode("//data/row[@ows_ID='234']", nsmgr).InnerText;

        Assert.IsNotNull(officeId);
        Assert.IsTrue(officeId == "234");
    } 

惨遭失败。

1 个答案:

答案 0 :(得分:2)

您的XPath不正确,您没有正确使用XmlNamespaceManager,并且您尝试根据ID而不是ID来选择节点。处理此问题的一种非常简单的方法是在XPath查询中使用local-name()函数。

此处的工作代码:

XmlDocument doc = new System.Xml.XmlDocument();
doc.LoadXml(@"<listitems xmlns:s=""uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"" xmlns:dt=""uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"" xmlns:rs=""urn:schemas-microsoft-com:rowset"" xmlns:z=""#RowsetSchema"" xmlns=""http://schemas.microsoft.com/sharepoint/soap/"">
  <rs:data ItemCount=""1"">
    <z:row ows_ID=""234"" ows_MetaInfo=""234;#"" ows__ModerationStatus=""0"" ows__Level=""1"" ows_owshiddenversion=""3"" ows_UniqueId=""234;#{94103987-5DD9-40DF-87B0-A13D76FA6875}"" ows_FSObjType=""234;#0"" ows_Created=""2010-06-25 14:28:22"" ows_FileRef=""234;#sites/dept/Lists/Office List/234_.000"" />
  </rs:data>
</listitems>");

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
nsmgr.AddNamespace("z", "#RowsetSchema");


var officeId = doc.SelectSingleNode("//rs:data/z:row/@ows_ID", nsmgr);
if (officeId != null)
    Console.WriteLine(officeId.InnerText);

如果您对XPath不太熟悉,可以考虑使用LINQ to XML作为替代方案:

XDocument doc = XDocument.Parse(@"<listitems xmlns:s=""uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"" xmlns:dt=""uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"" xmlns:rs=""urn:schemas-microsoft-com:rowset"" xmlns:z=""#RowsetSchema"" xmlns=""http://schemas.microsoft.com/sharepoint/soap/"">
  <rs:data ItemCount=""1"">
    <z:row ows_ID=""234"" ows_MetaInfo=""234;#"" ows__ModerationStatus=""0"" ows__Level=""1"" ows_owshiddenversion=""3"" ows_UniqueId=""234;#{94103987-5DD9-40DF-87B0-A13D76FA6875}"" ows_FSObjType=""234;#0"" ows_Created=""2010-06-25 14:28:22"" ows_FileRef=""234;#sites/dept/Lists/Office List/234_.000"" />
  </rs:data>
</listitems>");

XNamespace z = "#RowsetSchema";
var row = doc.Root.Descendants(z + "row").FirstOrDefault();

if (row != null)
{
    Console.WriteLine((string)row.Attribute("ows_ID"));
}


Console.ReadKey();