【问题标题】:Search for double values in XML [duplicate]在 XML 中搜索双精度值 [重复]
【发布时间】:2014-12-08 07:38:24
【问题描述】:

我有一个简短的问题要在 C# 中处理 XML 文件

我想在 XML 文件中搜索代码不止一次的双重条目。 我已经使用 XMLReader 进行了尝试,但我不知道如何在新的 XML 文件中编写双重产品条目。 问题是当“代码”在 XML 文件中不止一次时,我想在新列表中编写完整的“产品”。

我有以下 XML:

 <?xml version="1.0" encoding="utf-8"?>
<rescue>
<product>
 <key>0E25</key>
 <name>Hi World</name>
 <code>35646546546</code>
</product>

<product>
 <key>01EBC</key>
 <name>World</name>
 <code>123456789</code>
</product>

<product>
 <key>OC5999</key>
 <name>Double</name>
 <code>35646546546</code>
</product>
</rescue>

【问题讨论】:

  • 您所说的“完整产品”是什么意思?该产品自然会有多个条目 - 你想把它们都写出来吗?你试过什么了?我建议使用 LINQ to XML。一个简单的查询应该能够为您构建一个Lookup&lt;string, XElement&gt; - 从每个代码到该代码的产品元素的字典。然后,您可以对具有多个值的条目执行任何您喜欢的操作。
  • 我想在一个新的 XML 文件中编写产品(从 到 ,, 到 。在示例中,第三个产品( OC5999Double35646546546 )必须从写入新列表中删除

标签: c# xml


【解决方案1】:

一个可能的选择是创建一个类Product 来保存每个产品的值。然后,您可以使用XmlReader 读取产品,使用 LINQ 整理重复项,最后使用XmlWriter 将重复项写入单独的文件。一个快速的实现是;

public class Product
{
    public string Key { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
}

public class ReadAndWrite
{
    var productList = new List<Product>();

    using(XmlReader reader = XmlReader.Create("path/to/file.xml"))
    {
        Product p;
        while(reader.Read())
        {
            if(reader.IsStartElement())
            {
                switch(reader.Name)
                {
                    case "product": 
                        p = new Product(); 
                        break;

                    case "code" :
                        reader.Read(); //Point it one step forward to read the value
                        p.Code = reader.Value;
                        break;

                    //Etc...                           
                }
            }

            if(reader.Name == "product" && reader.NodeType == XmlNodeType.EndElement)
            {
                productList.Add(p);
            }
        }
    }

    var duplicates = productList.GroupBy(p => p.Code).Where(x => x.Count() > 1).SelectMany(v => v).ToList();

    using(XmlWriter writer = XmlWriter.Create("path/to/duplicates.xml"))
    {
        writer.WriteStartDocument();
        writer.WriteStartElement("Duplicates");

        foreach(var duplicate in duplicates)
        {
            writer.WriteStartElement("Product");

            writer.WriteElementString("Name", duplicate.Name);
            //Etc...

            writer.WriteEndElement()
        }

        writer.WriteEndElement();
        writer.WriteEndDocument();
    }
}

【讨论】:

  • 感谢您的帮助!这对我帮助很大!
【解决方案2】:

这可以使用XElement 来完成。

XElement doc = XElement.Parse(xml);  // xml-string, alternativeley, use XElement.Load("path/to/file.xml")
            var doc = XElement.Parse(xml);

IEnumerable<XElement> products;
products = doc.Descendants("product")
    .Where(e =>
        {
            var xElement = e.Element("name");
            return xElement != null && xElement.Value == "Double";
        })
    .GroupBy(e => e.ToString())
    .Where(e => e.Count() > 1)
    .Select(p => p.First());

另外,请参阅related question。

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2010-10-16
    • 1970-01-01
    • 2015-12-17
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多