C# 在XML中搜索双值
我有一个简短的问题要用C语言处理XML文件 我想搜索两个条目,其中代码在XML文件中不止一次。 我已经用XMLReader尝试过了,但我不知道如何在新的XML文件中编写双产品条目。 问题是,当代码在XML文件中多次出现时,我希望在一个新列表中编写完整的产品 我有以下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
<?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());