C# 如何获取所有xml节点和值

C# 如何获取所有xml节点和值,c#,.net,xml-parsing,C#,.net,Xml Parsing,我有一个xml,希望从中获取所有节点和值。下面是我要创建的源xml和输出的示例: <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <pric

我有一个xml,希望从中获取所有节点和值。下面是我要创建的源xml和输出的示例:

<bookstore>
  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price curr="$">30.00</price>
  </book>
</bookstore>

Nodes   Values
bookstore.book.category COOKING
bookstore.book.title.lang   en
bookstore.book.title    Everyday Italian
bookstore.book.author   Giada De Laurentiis
bookstore.book.year 2005
bookstore.book.price.curr   $
bookstore.book.price    30

日常意大利语
吉娅达·德·劳伦蒂斯
2005
30
节点值
书店、书籍、分类烹饪
bookstore.book.title.lang en
每日意大利语
书店、书籍、作家吉亚达·德·劳伦蒂斯
书店。图书。2005年
bookstore.book.price.curr$
价格

我要创建的输出由两列、节点及其值组成。我怎样才能做到这一点?我应该使用XmlDocument类吗?

我建议使用一个递归方法,该方法接受包含当前路径和要进入的XmlNode的字符串。在每个递归中,看起来您希望遍历所有节点属性,然后遍历每个子节点。检查节点类型以确定何时到达递归的末尾

将原始XML加载到XmlDocument中,然后从DocumentElement节点开始调用递归方法

编辑:

这不是我编写过的最漂亮的代码,但它接受给定的输入并生成请求的输出:

static void Main(string[] args)
{
    string xmlSrc = @"<bookstore><book category=""COOKING""><title lang=""en"">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price curr=""$"">30.00</price></book></bookstore>";

    XmlDocument xDoc = new XmlDocument();
    xDoc.LoadXml(xmlSrc);

    StringBuilder sbOut = new StringBuilder();
    sbOut.AppendLine("Nodes\tValues");
    sbOut.Append(XmlToText(xDoc.DocumentElement));

    Console.WriteLine(sbOut.ToString());
    Console.WriteLine("Press any key to exit...");
    Console.ReadLine();
}


static StringBuilder XmlToText(XmlElement node, string generationPath = "")
{
    StringBuilder sbRet = new StringBuilder();

    generationPath += (String.IsNullOrEmpty(generationPath) ? "" : ".") + node.Name;

    foreach( XmlAttribute attr in node.Attributes)
    {
        sbRet.AppendLine(String.Format("{0}.{1}\t{2}", generationPath, attr.Name, attr.Value));
    }

    foreach( XmlNode child in node.ChildNodes)
    {
        if( child.NodeType == XmlNodeType.Element)
        {
            sbRet.Append(XmlToText(child as XmlElement, generationPath));
        }
        else if ( child.NodeType == XmlNodeType.Text)
        {
            sbRet.AppendLine(String.Format("{0}\t{1}", generationPath, child.InnerText));
        }
    }

    return sbRet;
}
static void Main(字符串[]args)
{
字符串xmlSrc=@“每日意大利语Giada De Laurentiis200530.00”;
XmlDocument xDoc=新的XmlDocument();
LoadXml(xmlSrc);
StringBuilder sbOut=新的StringBuilder();
追加行(“节点\值”);
追加(XmlToText(xDoc.DocumentElement));
Console.WriteLine(sbOut.ToString());
Console.WriteLine(“按任意键退出…”);
Console.ReadLine();
}
静态StringBuilder XmlToText(XmlElement节点,字符串生成路径=)
{
StringBuilder sbRet=新的StringBuilder();
generationPath+=(String.IsNullOrEmpty(generationPath)?“”:“)+节点名;
foreach(node.Attributes中的xmldattribute attr)
{
AppendLine(String.Format(“{0}.{1}\t{2}”,generationPath,attr.Name,attr.Value));
}
foreach(node.ChildNodes中的XmlNode子节点)
{
if(child.NodeType==XmlNodeType.Element)
{
Append(XmlToText(子元素为xmlement,generationPath));
}
else if(child.NodeType==XmlNodeType.Text)
{
AppendLine(String.Format(“{0}\t{1}”,generationPath,child.InnerText));
}
}
返回sbRet;
}

这是您要查找的代码

private static void PrintOutNodesRecursive(XmlElement xmlElement, string currentStack)
{
    foreach (XmlAttribute xmlAttribute in xmlElement.Attributes)
    {
        Console.WriteLine("{0}.{1} = {2}", currentStack, xmlAttribute.Name, xmlAttribute.Value);
    }
    foreach (XmlNode xmlNode in xmlElement.ChildNodes)
    {
        XmlElement xmlChildElement = xmlNode as XmlElement;
        XmlText xmlText = xmlNode as XmlText;

        if (xmlText != null)
        {
            Console.WriteLine("{0} = {1}", currentStack, xmlText.Value);
        }

        if (xmlChildElement != null)
        {
            PrintOutNodesRecursive(xmlChildElement, currentStack + "." + xmlChildElement.Name);
        }
    }
}


static void Main(string[] args)
{
    string xmlContent = @"<bookstore>
      <book category=""COOKING"">
        <title lang=""en"">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price curr=""$"">30.00</price>
      </book>
    </bookstore>";

    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.LoadXml(xmlContent);

    PrintOutNodesRecursive(xmlDocument.DocumentElement, xmlDocument.DocumentElement.Name);

}
private static void PrintOutNodesRecursive(xmlement xmlement,string currentStack)
{
foreach(xmlement.Attributes中的xmldattribute)
{
WriteLine(“{0}.{1}={2}”,currentStack,xmldattribute.Name,xmldattribute.Value);
}
foreach(xmlement.ChildNodes中的XmlNode)
{
XmlElement xmlChildElement=xmlNode作为XmlElement;
XmlText XmlText=xmlNode作为XmlText;
如果(xmlText!=null)
{
WriteLine(“{0}={1}”,currentStack,xmlText.Value);
}
if(xmlChildElement!=null)
{
PrintOutNodesRecursive(xmlChildElement,currentStack+“+xmlChildElement.Name);
}
}
}
静态void Main(字符串[]参数)
{
字符串xmlContent=@”
日常意大利语
吉娅达·德·劳伦蒂斯
2005
30
";
XmlDocument XmlDocument=新的XmlDocument();
LoadXml(xmlContent);
PrintOutNodesRecursive(xmlDocument.DocumentElement,xmlDocument.DocumentElement.Name);
}

我目前没有看到任何XML。。。如果您确实有一些XML,我建议一般使用LINQ to XML。您可以使用
subjects()
获取所有元素,然后使用
AncestorsAndSelf()
为每个元素构建一个名称链。我建议您尝试使用这么多的信息,并包括您在问题中取得的进展(以及XML)。源XML肯定是有益的,因为从输出来看,它看起来不是有效的XML。我认为节点不允许同时有子节点和文本值(每日意大利语)。只需发布您需要的代码。如果对您有效,请将其标记为答案。它产生的输出与您需要的完全相同。谢谢