C# 将XDocument解析为字典<;字符串,字符串>;

C# 将XDocument解析为字典<;字符串,字符串>;,c#,.net,xml,C#,.net,Xml,在如何将整个XML文档解析为字典方面,我需要朝着正确的方向做一点努力。我的计划是让键成为路径,每个嵌套类型用“->”分隔。例如: <Foo> <Bar>3</Bar> <Foo> <Bar>10</Bar> </Foo> </Foo> 但我不确定如何递归地遍历每个元素。 感谢您的帮助。简单的解决方案: private static string Get

在如何将整个XML文档解析为字典方面,我需要朝着正确的方向做一点努力。我的计划是让键成为路径,每个嵌套类型用“->”分隔。例如:

<Foo>
    <Bar>3</Bar>
    <Foo>
        <Bar>10</Bar>
    </Foo>
</Foo>
但我不确定如何递归地遍历每个元素。
感谢您的帮助。

简单的解决方案:

    private static string GetElementPath(XElement element)
    {
        var parent = element.Parent;
        if(parent == null)
        {
            return element.Name.LocalName;
        }
        else
        {
            return GetElementPath(parent) + "->" + element.Name.LocalName;
        }
    }

    static void Main(string[] args)
    {
        var xml = @"
            <Foo>
                <Bar>3</Bar>
                <Foo>
                    <Bar>10</Bar>
                </Foo>
            </Foo>";
        var xdoc = XDocument.Parse(xml);
        var dictionary = new Dictionary<string, string>();
        foreach(var element in xdoc.Descendants())
        {
            if(!element.HasElements)
            {
                var key = GetElementPath(element);
                dictionary[key] = (string)element;
            }
        }
        Console.WriteLine(dictionary["Foo->Bar"]);
    }
私有静态字符串GetElementPath(XElement元素)
{
var parent=element.parent;
如果(父项==null)
{
返回element.Name.LocalName;
}
其他的
{
返回GetElementPath(父项)+“->”+element.Name.LocalName;
}
}
静态void Main(字符串[]参数)
{
var xml=@”
3.
10
";
var xdoc=XDocument.Parse(xml);
var dictionary=newdictionary();
foreach(xdoc.subjects()中的var元素)
{
if(!element.HasElements)
{
var key=GetElementPath(元素);
字典[键]=(字符串)元素;
}
}
Console.WriteLine(字典[“Foo->Bar]”);
}

简单的解决方案:

    private static string GetElementPath(XElement element)
    {
        var parent = element.Parent;
        if(parent == null)
        {
            return element.Name.LocalName;
        }
        else
        {
            return GetElementPath(parent) + "->" + element.Name.LocalName;
        }
    }

    static void Main(string[] args)
    {
        var xml = @"
            <Foo>
                <Bar>3</Bar>
                <Foo>
                    <Bar>10</Bar>
                </Foo>
            </Foo>";
        var xdoc = XDocument.Parse(xml);
        var dictionary = new Dictionary<string, string>();
        foreach(var element in xdoc.Descendants())
        {
            if(!element.HasElements)
            {
                var key = GetElementPath(element);
                dictionary[key] = (string)element;
            }
        }
        Console.WriteLine(dictionary["Foo->Bar"]);
    }
私有静态字符串GetElementPath(XElement元素)
{
var parent=element.parent;
如果(父项==null)
{
返回element.Name.LocalName;
}
其他的
{
返回GetElementPath(父项)+“->”+element.Name.LocalName;
}
}
静态void Main(字符串[]参数)
{
var xml=@”
3.
10
";
var xdoc=XDocument.Parse(xml);
var dictionary=newdictionary();
foreach(xdoc.subjects()中的var元素)
{
if(!element.HasElements)
{
var key=GetElementPath(元素);
字典[键]=(字符串)元素;
}
}
Console.WriteLine(字典[“Foo->Bar]”);
}

您需要了解xpath,使用的路径格式与您想要的稍有不同,但是如果需要,您可以创建一个wrap函数

string GetByPath(string mypath)
{
  //process path, and reformat it to xpath
  //then get by xpath
}


您需要了解xpath,使用的路径格式与您想要的稍有不同,但是如果需要,您可以创建一个wrap函数

string GetByPath(string mypath)
{
  //process path, and reformat it to xpath
  //then get by xpath
}


另一种选择,但不确定XML文档的真实结构

    string data = "<Foo><Bar>3</Bar><Foo><bar>123</bar></Foo></Foo>";

    XDocument xdoc = XDocument.Parse(data);
    Dictionary<string, string> dataDict = new Dictionary<string, string>();

    foreach (XElement xelement in doc.Descendants().Where(x => x.HasElements == false))
    {
        int keyInt = 0;
        string keyName = xelement.Name.LocalName;

        while (dataDict.ContainsKey(keyName))
            keyName = xelement.Name.LocalName + "->" + keyInt++;

        dataDict.Add(keyName, xelement.Value);
    }
string data=“3123”;
XDocument xdoc=XDocument.Parse(数据);
Dictionary dataDict=新字典();
foreach(doc.subscriptions()中的XElement XElement,其中(x=>x.HasElements==false))
{
int-keyInt=0;
字符串keyName=xelement.Name.LocalName;
while(dataDict.ContainsKey(keyName))
keyName=xelement.Name.LocalName+“->”+keyInt++;
dataDict.Add(keyName,xelement.Value);
}

另一种选择,但不确定XML文档的真实结构

    string data = "<Foo><Bar>3</Bar><Foo><bar>123</bar></Foo></Foo>";

    XDocument xdoc = XDocument.Parse(data);
    Dictionary<string, string> dataDict = new Dictionary<string, string>();

    foreach (XElement xelement in doc.Descendants().Where(x => x.HasElements == false))
    {
        int keyInt = 0;
        string keyName = xelement.Name.LocalName;

        while (dataDict.ContainsKey(keyName))
            keyName = xelement.Name.LocalName + "->" + keyInt++;

        dataDict.Add(keyName, xelement.Value);
    }
string data=“3123”;
XDocument xdoc=XDocument.Parse(数据);
Dictionary dataDict=新字典();
foreach(doc.subscriptions()中的XElement XElement,其中(x=>x.HasElements==false))
{
int-keyInt=0;
字符串keyName=xelement.Name.LocalName;
while(dataDict.ContainsKey(keyName))
keyName=xelement.Name.LocalName+“->”+keyInt++;
dataDict.Add(keyName,xelement.Value);
}
公共静态void parse()
{
Stack stck=新堆栈();
列表节点=新列表();
字典=新字典();
使用(XmlReader=XmlReader.Create(“路径:\\xml.xml”))
{
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
stck.Push(reader.Name);
}
if(reader.NodeType==XmlNodeType.Text)
{
StringBuilder str=新的StringBuilder();
如果(stck.Count>0)
nodes=stck.ToList();
//列表节点;
nodes.Reverse(0,nodes.Count);
foreach(节点中的字符串节点)
str.Append(node+“-->”);
Add(str.ToString(),reader.Value);
str.Clear();
}
if(reader.NodeType==XmlNodeType.EndElement)
{
stck.Pop();
}
}
}
foreach(字典中的KeyValuePair KVPair)
Console.WriteLine(KVPair.Key+“:”+KVPair.Value);
Console.Read();
}
公共静态void parse()
{
Stack stck=新堆栈();
列表节点=新列表();
字典=新字典();
使用(XmlReader=XmlReader.Create(“路径:\\xml.xml”))
{
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element)
{
stck.Push(reader.Name);
}
if(reader.NodeType==XmlNodeType.Text)
{
StringBuilder str=新的StringBuilder();
如果(stck.Count>0)
nodes=stck.ToList();
//列表节点;
nodes.Reverse(0,nodes.Count);
foreach(节点中的字符串节点)
str.Append(node+“-->”);
Add(str.ToString(),reader.Value);
str.Clear();
}
if(reader.NodeType==XmlNodeType.EndElement)
{
stck.Pop();
}
}
}
foreach(dict中的KeyValuePair KVPair)