我关闭了最后一个问题,因为有人评论说没有足够的研究。我对他们的研究越多,我就会变得更加困惑。我认为应该在我的理解和其他地方的帖子中起作用。
XML sample
<?xml version="1.0" encoding="UTF-8" ?>
<multistatus xmlns="DAV:">
<schmeata>
<classschema name="Space">
<base_class>Space</base_class>
</classschema>
<classschema name="Tapestry">
<base_class>File</base_class>
</classschema>
<classschema name="Document">
<base_class>File</base_class>
</classschema>
</schmeata>
</multistatus>
我试图获取具有带有"文件"值的base_class子女的classschema节点的名称属性。因此,结果应该是"挂毯"one_answers"文档"
我可以轻松地返回所有classschemata节点
foreach (XmlNode node in xmlDoc.SelectNodes("//DAV:schemata/DAV:classschema", nsmgr))
{
strNode = node.Attributes["name"].Value;
responseString += strNode +" ";
}
return responseString;
我可以通过循环浏览所有基本_CLASS节点来获取base_class value ='file'。
foreach (XmlNode node in xmlDoc.SelectNodes("//DAV:schemata/DAV:classschema/DAV:base_class", nsmgr))
{
if (node.InnerText == "File")
{
strNode = node.InnerText;
responseString += strNode +" ";
}
}
return responseString;
但是,如果我尝试过滤或使用轴来引用孩子失败的父节点。
我的过滤工作的一个示例是基于SelectNodes方法。
foreach (XmlNode node in xmlDoc.SelectNodes("//DAV:schemata/DAV:classschema[/DAV:base_class(contains,'File')]", nsmgr)) or
foreach(xmldoc.selectnodes中的xmlnode节点("//dav:schemata/dav:classSchema [/dav:base_class =='file']",nsmgr(
(( (以及我看到的示例,很难说是Linq2xml还是Xdocument,并混合使用PHP或其他并非总是指定的其他语言,我现在被jumpl.
。我的下一个尝试将是selectnodes("//dav:schemata/dav:classSchemata [/dav:baseclass(包含,'file'(]"@name,nsmgr(;和对此的变化。
我从其他示例中想到,他们完全想要的是我想要的,但是当实施时,由于无法解释。
这应该为您提供所追求的结果。基本上,它寻找所有具有Value == "File"
的第一个元素的classschema
元素,然后选择其name
属性Value
。请注意,我还使用了string.Join
方法(对于这样的东西来说很方便(将结果变成了您需要的空间划界字符串。
var xmlDoc = XDocument.Load("YourFile.xml");
var result = xmlDoc.Descendants("{DAV:}classschema")
.Where(x => x.Elements().First().Value == "File")
.Attributes("name")
.Select(x => x.Value);
string spaceDelimited = string.Join(" ", result);
这是我现在正在使用的。我会在一堆圣经上发誓我在早期的测试中做到了这一点,并提交了。但这确实有效。在发布代码时,我看到我正在使用的内部循环现在已经评论,这是问题所在。我正在循环循环的东西,所以返回空的。
foreach (XmlNode node in xmlDoc.SelectNodes("//DAV:schemata/DAV:classschema[DAV:base_class='File']", nsmgr))
{
//strNode = node.Attributes["name"].Value;
//if (node.InnerText == "File")
// {
strNode = node.Attributes["name"].Value;
//strNode = node.InnerText;
responseString += strNode +" ";
// }
}
return responseString;
感谢您的帮助。我的下一步将是使用每个返回的节点,并获取所有base_class元素并过滤,以便将其中一些返回。不知道我在寻找什么。需要评估XML以寻找独特性,以进一步捕获我想要的东西。这意味着我现在拥有唯一的classschema节点,其中包含"文件"的孩子元素获得了一些子元素兄弟姐妹,但不是全部。另一天的挑战。