在XML中搜索double值

时间:2014-12-08 07:38:24

标签: c# xml

我在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>

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

可以使用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