0

我结束了我的最后一个问题,因为有人评论说没有进行足够的研究。我研究得越多,我就越困惑。我认为在我的理解和从这里和其他地方的帖子中应该起作用的东西是行不通的。

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); 及其变化。

我从其他示例中认为,它们正是我想要的,但是在实施时不起作用,原因我无法解释。

4

2 回答 2

0

这应该会给你你想要的结果。基本上,它会查找所有classschema具有第一个元素的元素,Value == "File"然后选择它们的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);
于 2018-02-24T16:07:40.050 回答
0

这就是我现在使用的。我会发誓我在早期的测试中做过这堆圣经,并归档了。但它确实有效。在发布代码时,我看到我使用的内部循环现在已被注释掉,这就是问题所在。我正在循环一些不需要循环的东西,所以返回的是空的。

 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 以寻找唯一性以进一步捕获我想要的内容。意思是现在我有唯一的带有包含“文件”的子元素的类模式节点得到一些子元素兄弟但不是全部。挑战另一天。

于 2018-02-25T06:55:03.477 回答