【问题标题】:XDocument return all element names and values to two separate listsXDocument 将所有元素名称和值返回到两个单独的列表
【发布时间】:2019-07-02 09:08:36
【问题描述】:

我有一个如下所示的 XML 文档:

<Settings>
  <!-- Comment1 -->
  <A> 1 </A>
  <!-- Comment2 -->
  <B> 2 </B>
  <!-- Comment3 -->
  <C> 3 </C>
  <!-- Comment4 -->
  <D> 4 </D>
</Settings>

如何将元素名称 (A,B,C,D) 添加到列表中,并将元素值 (1,2,3,4) 添加到另一个列表中。请注意,实际上我正在处理的 XML 文件有超过 1000 多行代码,因此我需要一种更有效的方法,而不是一个一个地提取每个值和元素并将其添加到列表中......

【问题讨论】:

  • 你试过了吗?
  • 您想要 2 个列表,一个用于元素名称,另一个用于值?为什么不是字典?
  • 这有帮助吗:document.Root.Elements().Select(x =&gt; ...?
  • docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…,这个例子是否涵盖了你的情况?
  • 但不是从根开始,而是从设置后代开始。您是否有设置之外的元素或设置是您的根?

标签: c# xml list linq-to-xml


【解决方案1】:

使用LinqToXML 将部分 Xml 解析为字典,加载您的 Xdocument。
选择设置下的所有内容。 枚举这些元素并使它们成为字典。

如果有重复元素,将ToDictionary替换为Select

string input = @"<root>
<Settings>
    <A> 1 </A>
    <B> 2 </B>
    <C> 3 </C>
    <D> 4 </D>
</Settings>
<Hello>World</Hello>
<Foo>Bar</Foo>
</root>";

XDocument xdoc = XDocument.Parse(input);

var result = xdoc.Descendants("Settings")
    .Elements()
    .ToDictionary(
        el => el.Name.LocalName,
        el => el.Value 
    );

结果:

Dumping object(System.Collections.Generic.Dictionary`2[String,String])
  [
   [A,  1 ]
   ,
   [B,  2 ]
   ,
   [C,  3 ]
   ,
   [D,  4 ]
]

访问像settings["A"]这样的值。

LiveDemo


注意:这里的字典是“[String,String]”,但您可以转换该值以满足您的需要。

【讨论】:

    【解决方案2】:

    你可以试试这个代码。

    class Program
        {
            static void Main(string[] args)
            {
                //Declare and load your xml file
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load("XMLFile.xml");
    
                //Instatiate the object where you want to store the list values
                XMLData xmlData = new XMLData();
                xmlData.listKeys = new List<string>();
                xmlData.listValues = new List<string>();
    
                //Pick the settings parent node 
                XmlNode xmlSettingsNode = xmlDoc.FirstChild;
    
                //Loop through the list and add name and values to list
                foreach (XmlNode xmlNode in xmlSettingsNode.ChildNodes)
                {
                    //Ignore commented lines
                    if (xmlNode.NodeType != XmlNodeType.Comment)
                    {
                        xmlData.listKeys.Add(xmlNode.Name);
                        xmlData.listValues.Add(xmlNode.InnerText);
                    }
                }
            }
        }
    
    //Data model for storing list data
        public class XMLData
        {
           public List<string> listKeys { get; set; }
           public List<string> listValues { get; set; }
    
        }
    

    【讨论】:

    • 列出键和列表值是个坏主意。没有什么可以保持列表中元素的顺序没有索引。
    • 是的,字典可以用来代替列表来像键值对一样存储它,但是如果你看这个问题,列表就是他要的。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多