1

我有以下 XML:

<Result ID="1,New" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
    <ErrorCode>0x00000000</ErrorCode>
    <ID />
    <z:row ows_ID="6" />
</Result>

我一直在尝试ows_ID使用以下方法获取值:

XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/";
string newId = (from r in resDoc.Descendants(ns + "row")
               select (string)r.Attribute("ows_ID")).First();

它不返回任何记录,并且:

XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/";
string newId = (from r in resDoc.Descendants(ns + "z:row")
               select (string)r.Attribute("ows_ID")).First();

这会引发错误:

我获得这个值的正确方法是什么?

更新 - 完整z:row节点

<z:row ows_ContentTypeId="0x010090ADDB8ED990B741A07020AB204CDB880100311975766C6F0E4CBE4EBFBC3CBFD9AB" ows_Title="test 2 attachments343434" ows_AggregateDesc="&lt;div class=&quot;ExternalClass05363FABD7BB400483A6AE4BB3B9B6CE&quot;&gt;&lt;p&gt;yes?&lt;/p&gt;&lt;/div&gt;" ows_Remarks="&lt;div class=&quot;ExternalClassB63AA0BFC1804E24B10C9559D7FBEBA5&quot;&gt;&lt;p&gt;no?&lt;/p&gt;&lt;/div&gt;" ows_PublishDate="2012-06-15 12:00:00" ows_MemoStatus="Submitted" ows_ID="6" ows_ContentType="FridayMemo" ows_Modified="2012-06-27 14:00:47" ows_Created="2012-06-27 14:00:47" ows_Author="49;#Abe Miessler" ows_Editor="49;#Abe Miessler" ows_owshiddenversion="1" ows_WorkflowVersion="1" ows__UIVersion="512" ows__UIVersionString="1.0" ows_Attachments="0" ows__ModerationStatus="0" ows_LinkTitleNoMenu="test 2 attachments343434" ows_LinkTitle="test 2 attachments343434" ows_LinkTitle2="test 2 attachments343434" ows_SelectTitle="6" ows_Order="600.000000000000" ows_GUID="{393F36F5-FFA8-4F6E-A12A-1107AA713F25}" ows_FileRef="6;#nc/ceo/Lists/FridayMemo/6_.000" ows_FileDirRef="6;#nc/ceo/Lists/FridayMemo" ows_Last_x0020_Modified="6;#2012-06-27 14:00:47" ows_Created_x0020_Date="6;#2012-06-27 14:00:47" ows_FSObjType="6;#0" ows_SortBehavior="6;#0" ows_PermMask="0x7fffffffffffffff" ows_FileLeafRef="6;#6_.000" ows_UniqueId="6;#{F4C6B345-4590-4791-9384-18983132F055}" ows_ProgId="6;#" ows_ScopeId="6;#{8450C4BD-0866-40ED-A0CD-22E3105E0845}" ows__EditMenuTableStart="6_.000" ows__EditMenuTableStart2="6" ows__EditMenuTableEnd="6" ows_LinkFilenameNoMenu="6_.000" ows_LinkFilename="6_.000" ows_LinkFilename2="6_.000" ows_ServerUrl="/nc/ceo/Lists/FridayMemo/6_.000" ows_EncodedAbsUrl="http://sptestmnc.nevcounty.net/nc/ceo/Lists/FridayMemo/6_.000" ows_BaseName="6_" ows_MetaInfo="6;#" ows__Level="1" ows__IsCurrentVersion="1" ows_ItemChildCount="6;#0" ows_FolderChildCount="6;#0" 
  xmlns:z="#RowsetSchema" />
4

3 回答 3

2
    var ns = XNamespace.Get("#RowsetSchema");
    var id = xml
      .Descendants(ns + "row")
      .Select(row => row.Attribute("ows_ID").Value)
      .First();

或者

    var ns = XNamespace.Get("#RowsetSchema");
    var id = xml
      .Descendants(ns + "row")
      .First()
      .Attribute("ows_ID")
      .Value;
于 2012-06-28T01:13:10.800 回答
1

您没有为该Descendants方法正确指定命名空间。它需要一个XName(它提供了一个字符串的隐式转换,让你误以为它需要一个字符串)。您可以使用Get(string,string)静态方法XName来指定命名空间:

string ns = "http://schemas.microsoft.com/sharepoint/soap/";
string newId = (from r in resDoc.Descendants(XName.Get("row",ns))
    select (string)r.Attribute("ows_ID")).First();

根据 OP 的要求,这是我编写的完整示例代码,可在 LINQPad 中编译并正常工作:

var ns = "http://schemas.microsoft.com/sharepoint/soap/";
var xml = 
    @"<Result ID=""1,New"" xmlns=""" + ns + @""">" +
        @"<ErrorCode>0x00000000</ErrorCode>" +
        @"<ID />" +
        @"<z:row ows_ID=""6"" />" +
    @"</Result>";

XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
mgr.AddNamespace("z", "http://schemas.microsoft.com/sharepoint/soap/");
XmlParserContext ctx = new XmlParserContext(null, mgr, null, XmlSpace.Default);
XDocument resDoc;
using( XmlReader reader = XmlReader.Create(new StringReader(xml), null, ctx) ) {
    resDoc = XDocument.Load(reader);
}

string newId = (from r in resDoc.Descendants(XName.Get("row",ns))
    select (string)r.Attribute("ows_ID")).First();

Console.WriteLine( newId );     // prints "6"
于 2012-06-27T22:06:52.800 回答
0

您必须使用“z”命名空间,该命名空间必须在此代码中未显示的某处定义才能访问该元素,您正在使用的就是您为根元素设置的那个。

于 2012-06-27T21:47:15.053 回答