C# 如何读取XML文件节点属性和子节点属性值?

C# 如何读取XML文件节点属性和子节点属性值?,c#,C#,如何读取包含以下内容的xml文件: <?xml version="1.0" encoding="utf-8"?> <A> <B value="1"> <Hash algo="SHA256" value="905C45B51B970434D7159641D9F6A88DC91E9C35030618A729C8E4BE174711AF" /> </B> <B value="2"> <H

如何读取包含以下内容的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<A>
   <B value="1">
     <Hash algo="SHA256" value="905C45B51B970434D7159641D9F6A88DC91E9C35030618A729C8E4BE174711AF" />
   </B>
   <B value="2">
     <Hash algo="SHA256" value="649721FF455E9B100E691A3857696350E14364029C34C9438AB3EA9665C91292" />
   </B>
   <B value="3">
     <Hash algo="SHA256" value="90FC91C4B82BF440FDAFECF3303DCA8FB9F2E9D7EFFAE394D8B74D0C7CD7DA10" />
   </B>
</A>

您的问题还不清楚,但这里有一些快速代码,可以满足您的需要

XDocument xdoc = XDocument.Load(@"file.xml");
if (xdoc.Root != null)
{
    var bs = xdoc.Root.Descendants("B");

    foreach (var bNode in bs)
    {
        Console.Out.WriteLine("B Value: " + bNode.FirstAttribute.Value);
        var hash = bNode.XPathSelectElement("Hash");
        Console.Out.WriteLine("algo is : " + hash.FirstAttribute.Value);
        Console.Out.WriteLine("value is : " + hash.FirstAttribute.NextAttribute.Value);
    } 
}

我建议您温习一下XDocument和XmlDocument(这两个版本仍然相关,具体取决于您的代码的使用年限:)

您的问题还不清楚,但这里有一些快速代码可以满足您的需要

XDocument xdoc = XDocument.Load(@"file.xml");
if (xdoc.Root != null)
{
    var bs = xdoc.Root.Descendants("B");

    foreach (var bNode in bs)
    {
        Console.Out.WriteLine("B Value: " + bNode.FirstAttribute.Value);
        var hash = bNode.XPathSelectElement("Hash");
        Console.Out.WriteLine("algo is : " + hash.FirstAttribute.Value);
        Console.Out.WriteLine("value is : " + hash.FirstAttribute.NextAttribute.Value);
    } 
}

我建议大家温习一下XDocument和XmlDocument(这两个版本仍然相关,具体取决于您的代码有多旧:)

Hi,非常欢迎大家!你自己试过什么?有几种不同的方法可以使用.NET库和第三方库读取和解析XML。如果您尝试查看右下角的相关问题,我相信已经有几个答案可用。=)这里有很多例子可以帮助你:我看不出有理由否决这个问题它是合法的,是的,它很古老,在世界上的每一本书中都有,但我们可以通过提供一个合法的答案来帮助这个人。你使用的代码非常冗长,有更好的方法来完成这个确切的任务,L.Bs解决方案,我的和HatSoft的版本完全符合您的要求,不同之处在于您使用的是正向阅读,而我们不是,我们使用的是随机访问,这对您的解决方案很重要吗?您好,非常欢迎使用SO!你自己试过什么?有几种不同的方法可以使用.NET库和第三方库读取和解析XML。如果您尝试查看右下角的相关问题,我相信已经有几个答案可用。=)这里有很多例子可以帮助你:我看不出有理由否决这个问题它是合法的,是的,它很古老,在世界上的每一本书中都有,但我们可以通过提供一个合法的答案来帮助这个人。你使用的代码非常冗长,有更好的方法来完成这个确切的任务,L.Bs解决方案,我的版本和HatSoft的版本完全符合您的要求,区别在于您使用的是正向阅读,而我们不是。我们使用的是随机访问,这对您的解决方案重要吗?请解释-1,因为我看不出我的回答有什么问题。我没有投您反对票,但否决票很有可能是因为这是一个只有密码的答案。我们希望人们至少用文字来解释问题,而不是仅仅分发代码。@Nicolas同意你的观点,我将用解释更新我的答案请解释-1,因为我看不出我的答案有什么问题。我没有投你反对票,但投反对票的可能性很高,因为这是一个代码唯一的答案。我们希望人们至少用文本来解释问题,而不是仅仅分发代码。@Nicolas同意你的观点,我将用解释更新我的答案
XDocument xDoc = XDocument.Parse(xml);
var result = xDoc.Descendants("B")
    .Select(b => new
    {
        BValue = b.Attribute("value").Value,
        Alg = b.Element("Hash").Attribute("algo").Value,
        AlgValue = b.Element("Hash").Attribute("value").Value,
    })
    .ToArray();
XElement doc = XElement.Load(yourxmlfilename);//Load the document

foreach (XElement b in doc.Elements("B"))//Iterate all elements B
{
    var xAttribute = b.Attribute("value");//get attribute called value
    if (xAttribute != null)
    {
        string v = xAttribute.Value;//now you have the B value
    }

    foreach (XElement h in b.Elements("Hash"))//Iterate all elements Hash
    {
        var xAttributev = h.Attribute("value");//get attribute called value
        if (xAttributev != null)
        {
               string hashValue = xAttribute.Value;//now you have the Hash value
        }

        var xAttributeh = h.Attribute("algo");//get attribute called algo
        if (xAttributeh != null)
        {
           string algorithm = xAttributeh.Value;//now you have the Hash algorithm
        }
    }
}