问题
I have the following XML:
<Result ID="1,New" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<ErrorCode>0x00000000</ErrorCode>
<ID />
<z:row ows_ID="6" />
</Result>
I have been trying to get the ows_ID
value using the following methods:
XNamespace ns = "http://schemas.microsoft.com/sharepoint/soap/";
string newId = (from r in resDoc.Descendants(ns + "row")
select (string)r.Attribute("ows_ID")).First();
which returns no records, and:
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();
which throws an error from the :
What is the proper way for me to get this value?
UPDATE - Complete z:row
node
<z:row ows_ContentTypeId="0x010090ADDB8ED990B741A07020AB204CDB880100311975766C6F0E4CBE4EBFBC3CBFD9AB" ows_Title="test 2 attachments343434" ows_AggregateDesc="<div class="ExternalClass05363FABD7BB400483A6AE4BB3B9B6CE"><p>yes?</p></div>" ows_Remarks="<div class="ExternalClassB63AA0BFC1804E24B10C9559D7FBEBA5"><p>no?</p></div>" 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" />
回答1:
var ns = XNamespace.Get("#RowsetSchema");
var id = xml
.Descendants(ns + "row")
.Select(row => row.Attribute("ows_ID").Value)
.First();
or
var ns = XNamespace.Get("#RowsetSchema");
var id = xml
.Descendants(ns + "row")
.First()
.Attribute("ows_ID")
.Value;
回答2:
You aren't specifying the namespace correctly for the Descendants
method. It takes an XName
(which offers an implicit cast from string, fooling you into thinking it takes a string). You can use the Get(string,string)
static method of XName
to specify the namespace:
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();
Per the OP's request, here is the complete sample code I wrote, that compiles and works correctly in 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"
回答3:
You have to use the 'z' namespace which must be defined somewhere not shown in this code to access that element, the one that you are using is the one you are setting for your root element.
来源:https://stackoverflow.com/questions/11235139/how-to-get-this-attribute-using-linq-to-xml