C#linq2xml从子元素值获得父属性



我关闭了最后一个问题,因为有人评论说没有足够的研究。我对他们的研究越多,我就会变得更加困惑。我认为应该在我的理解和其他地方的帖子中起作用。

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节点,其中包含"文件"的孩子元素获得了一些子元素兄弟姐妹,但不是全部。另一天的挑战。

相关内容

  • 没有找到相关文章

最新更新