我在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>
答案 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。