Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XML中搜索双值_C#_Xml - Fatal编程技术网

C# 在XML中搜索双值

C# 在XML中搜索双值,c#,xml,C#,Xml,我有一个简短的问题要用C语言处理XML文件 我想搜索两个条目,其中代码在XML文件中不止一次。 我已经用XMLReader尝试过了,但我不知道如何在新的XML文件中编写双产品条目。 问题是,当代码在XML文件中多次出现时,我希望在一个新列表中编写完整的产品 我有以下XML: <?xml version="1.0" encoding="utf-8"?> <rescue> <product> <key>0E25</key> <n

我有一个简短的问题要用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>

一个可能的选择是创建一个类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();
    }
}
这可以使用XElement完成


另外,请参见。

您所说的完整产品是什么意思?该产品自然会有多个条目-您想全部写出吗?到目前为止你试过什么?我建议使用LINQ转换XML。一个简单的查询应该能够为您构建一个查找——从每个代码到该代码的产品元素的字典。然后,您可以对具有多个值的条目执行任何操作。我想将产品从、、写到一个新的XML文件中。在本例中,第三个产品OC5999 Double 35646546546必须从一个新列表中删除感谢您的帮助!这对我帮助很大!
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());