0

我希望下面的函数读取 XML 文件并将所有数据保存到传递给函数的 UserClassDict 中。UserClassDict 保存一个(用户名,用户类)。用户类有一个属性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

首先,您不需要StreamWriteror 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

您可以使用 Linq to XML 解析您的 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 回答