我结束了我的最后一个问题,因为有人评论说没有进行足够的研究。我研究得越多,我就越困惑。我认为在我的理解和从这里和其他地方的帖子中应该起作用的东西是行不通的。
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 子级的类模式节点的名称属性。所以结果应该是“Tapestry”和“Document”
我可以轻松地返回所有类模式节点
foreach (XmlNode node in xmlDoc.SelectNodes("//DAV:schemata/DAV:classschema", nsmgr))
{
strNode = node.Attributes["name"].Value;
responseString += strNode +" ";
}
return responseString;
我可以通过像这样循环遍历所有 base_class 节点来获取 base_class 值 = 到“文件”。
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:schema/DAV:classschema[/DAV:base_class=='File']”, nsmgr))
连同我所见过的许多其他变体示例,很难判断它是 LINQ2XML 还是 XDocument,并且混入 PHP 或其他并不总是指定的语言中,我现在被吓到了。
我的下一个尝试将是 SelectNodes("//DAV:schemata/DAV:classschemata[/DAV:baseclass(contains,'File')]"@name,nsmgr); 及其变化。
我从其他示例中认为,它们正是我想要的,但是在实施时不起作用,原因我无法解释。