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 に答える