1

XMLドキュメント全体を辞書に解析する方法について正しい方向に少しプッシュする必要があります。私の計画では、キーをパスにし、ネストされた各タイプを「->」で分割します。例えば:

<Foo>
    <Bar>3</Bar>
    <Foo>
        <Bar>10</Bar>
    </Foo>
</Foo>

値を取得したい場合は、次を使用して辞書から値を取得します。

string value = Elements["Foo->Bar"];

ただし、各要素を再帰的に処理する方法はよくわかりません。助けていただければ幸いです。

4

4 に答える 4

4

簡単な解決策:

    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"]);
    }
于 2012-12-22T21:27:09.340 に答える
0

xpathを確認する必要があります。使用されるパスの形式は、必要なものとは少し異なりますが、必要に応じてラップ関数を作成できます。

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

http://support.microsoft.com/kb/308333

http://www.codeproject.com/Articles/9494/Manipulate-XML-data-with-XPath-and-XmlDocument-C

于 2012-12-22T21:33:48.027 に答える
0

別の方法ですが、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);
    }
于 2012-12-22T21:36:47.337 に答える
0
public static void parse()
    {
        Stack<String> stck = new Stack<string>();
        List<String> nodes = new List<string>();
        Dictionary<String, String> dictionary = new Dictionary<string, string>();

        using (XmlReader reader = XmlReader.Create("path:\\xml.xml"))
        {

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {

                    stck.Push(reader.Name);

                }
                if (reader.NodeType == XmlNodeType.Text)
                {
                    StringBuilder str = new StringBuilder();
                    if (stck.Count > 0)
                        nodes = stck.ToList<String>();
                    //List<String> _nodes ;
                    nodes.Reverse(0,nodes.Count);
                    foreach (String node in nodes)
                        str.Append(node + " --> ");

                    dictionary.Add(str.ToString(), reader.Value);
                    str.Clear();
                }
                if (reader.NodeType == XmlNodeType.EndElement)
                {

                    stck.Pop();

                }
            }
        }

        foreach (KeyValuePair<String, String> KVPair in dictionary)
            Console.WriteLine(KVPair.Key + " : " + KVPair.Value);
        Console.Read();
    }
于 2012-12-22T22:18:57.807 に答える