0

以下の関数で XML ファイルを読み取り、関数に渡される UserClassDict にすべてのデータを保存します。UserClassDict は a (username,User Class) を保存します。ユーザー クラスにはList<int> ControlNumber、ControlNumbers を格納するプロパティがあります。

読み取ろうとしている XML は次のようになります。

<UserClassDictionary>
   <adolan>
      <ControlNumber>791301</ControlNumber>
   </adolan>
   <afeazell>
      <ControlNumber>790253</ControlNumber>
   </afeazell>
   <asnyder>
      <ControlNumber>790210</ControlNumber>
      <ControlNumber>790308</ControlNumber>
   </asnyder>
   <semery/>
   <showard/>
   <talexander/>
</UserClassDictionary>

私が抱えている問題は、関数内の LINQ が異なる xml ノードを区別していないように見えることです。ノードをキーに、ノードを値に設定していないようです。

 static void XMLToDictionary(Dictionary<string,User> UserClassDict)
        {

        XmlDocument doc = new XmlDocument();
        doc.Load("UserClassDictionary.xml");

        StringWriter sw = new StringWriter();
        XmlTextWriter tx = new XmlTextWriter(sw);
        doc.WriteTo(tx);

        string str = sw.ToString();

        XDocument document = XDocument.Parse(str);

            foreach (XElement element in document.Descendants().Where(p => p.HasElements == false))
        {
            int keyInt = 0;
            string keyName = element.Name.LocalName;

            while (UserClassDict.ContainsKey(keyName))
                keyName = element.Name.LocalName + "_" + keyInt++;

            UserClassDict.Add(keyName, element.Value);
        }
        }
4

2 に答える 2

2

StreamWriterまず、またはは必要ありませんXmlTextWriter。代わりに使用できますXElement.Load()

XElement root = XElement.Load("UserClassDictionary.xml");
Dictionary<string, List<string>> values = new Dictionary<string, List<string>>();

foreach(XElement subNode in root.Elements().Where(x => x.Elements().Count() > 0))
{
    values.Add(subNode.Name.LocalName, subNode.Elements("ControlNumber")
        .Select(x => x.Value).ToList());
}

あなたの他の理由は、ループDescendentsの代わりに使用していたことです。Elementsこれは、xml 内のすべてのサブノード、さらには gradchild ノードを探しました。

于 2013-06-07T15:43:15.300 に答える
1

XML を解析し、Linq to XML を使用してユーザーの辞書を作成できます。

XDocument xdoc = XDocument.Load("UserClassDictionary.xml");
Dictionary<string, User> users = 
     xdoc.Root.Elements()
         .Select(u => new User {
             Name = u.Name.LocalName,
             ControlNumber = u.Elements().Select(cn => (int)cn).ToList()
          })
         .Where(u => ControlNumber.Any())
         .ToDictionary(u => u.Name);

または、既存の辞書を更新したい場合

var users = from u in xdoc.Root.Elements()
            where u.Elements().Any()
            select new User {
                 Name = u.Name.LocalName,
                 ControlNumber = u.Elements().Select(cn => (int)cn).ToList()
             };

foreach(var user in users)
     UserClassDict.Add(user.Name, user);
于 2013-06-07T15:42:11.233 に答える