如何使用C#从XmlDocument中获取具有其属性且没有子节点的根节点

时间:2015-02-26 09:10:06

标签: c# xml xml-parsing

我有一个xml,如:

<Customer id="">
 <Name />
 <Address />
</Customer>

我想只选择一个没有子节点的属性的根节点头(不是页脚):

<Customer id="">

2 个答案:

答案 0 :(得分:2)

如果属性是根元素,则可以使用Root属性:

XDocument Doc = XDocument.Parse(StringXML);

var RootNode= Doc.Root;
string NodeName = RootNode.Name.ToString();
string AttributeValue = RootNode.Attribute("id").Value;

如果xml中有多个Customer节点,则必须使用linq:

var nodes = from customer in Doc.Descendants("Customer")
                         select new { 
                                     NodeName = customer.Name.ToString(),               
                                     Id = customer.Attribute("id").Value 
                                    };

UPDATE:

要获取所有属性,您可以这样使用Attributes()

var nodess = from customer in Doc.Descendants("Customer")

             select new { 
                          NodeName = customer.Name.ToString(), 
                          Attributes = customer.Attributes() 
                        };

WORKING DOTNET FIDDLE EXAMPLE

答案 1 :(得分:1)

如果您只想将此节点作为字符串,则可以使用Root属性,然后按Environment.NewLine分割根并取第一个:

 XDocument xdoc = XDocument.Parse(InnerXML);
 var result = xdoc.Root.ToString()
                       .Split(new string[] {Environment.NewLine}, StringSplitOptions.None)
                       .First();

结果是:<Customer id="">

Additional1
 如果要获取属于root的所有属性名称和值,则可以使用:

var rootAttributesDatas = xdoc.Root
                         .Attributes()
                         .Select(x => new { AttributeName = x.Name, AttributeValue = x.Value })
                         .ToList();


Additional2
 如果您有多个customer节点,并希望选择所有关于它们的数据作为列表:

var allCustomerNodeDatas = xdoc.Root.Descendants("Customer")
                           .Select(x => new
                            {
                                 NodeName = x.Name,
                                 AttributesDatas = x.Attributes().Select(attr => new
                                 {
                                     AttributeName = attr.Name,
                                     AttributeValue = attr.Value
                                 }).ToList()
                            }).ToList();