给出以下来自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");
}
惨遭失败。
答案 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();