[英]How to get this attribute using linq to xml?
我有以下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="<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" />
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;
您没有为Descendants
方法正确指定名称空间。 它需要一个XName
(它提供一个来自字符串的隐式转换,欺骗你认为它需要一个字符串)。 您可以使用XName
的Get(string,string)
静态方法来指定命名空间:
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"
您必须使用'z'命名空间,该命名空间必须在此代码中未显示的位置定义才能访问该元素,您正在使用的那个是您为根元素设置的那个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.