2016-12-14 113 views
1

我有兩個包含產品列表的XML文檔。目前,我們只複製一個並將其粘貼到另一箇中,然後創建一個新的合併文檔,但是,這兩個文件具有許多相同的產品,因此我需要合併兩個並刪除重複項。我的XML文檔的結構如下:刪除Xml中的重複文檔

<?xml version="1.0" encoding="iso-8859-1"?> 
    <table> 
     <row Code="HST15154" 
     ProductName="test" 
     ProductName_EN="" 
     Description_EN="" 
     Price="" 
     ProductType1="HST ACCESSORIES" 
     ProductType2="SAM - Accessories" 
     ProductCategory="Accessories" 
     Remarks="" 
     /> 
    </table> 

我發現一些代碼,我試圖改變我的需求here。我只需要每個「代碼」中的一個。

using System; 
using System.Collections.Generic; 
using System.Xml; 

namespace HST_Merging_Console_App 
{ 
    public class Program 
    { 
     public void Main(string[] args) 
     { 
      //open the xml document 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml("U:\\Documents (U)\\XML Merging Tool\\productcollection_us.xml"); 

      //select all row elements 
      XmlNodeList parts = doc.SelectNodes("/row"); 

      //create a list of previously seen P/Ns 
      List<string> PartsSeen = new List<string>(); 

      foreach(XmlNode part in parts) 
      { 
       string partNumber = part.Attributes["Code"].Value; 

       //for each part, see if we have seen it before, if it is in the list, 
       //remove the part element from the parent to which it belongs 
       if (PartsSeen.Contains(partNumber)) 
        part.ParentNode.RemoveChild(part); 
       else 
        PartsSeen.Add(partNumber); 
      } 
      Console.Read(); 
      doc.Save("U:\\Documents (U)\\XML Merging Tool\\productcollection_merged.xml"); 
     } 
    } 
} 

我收到了幾個錯誤,當我運行此:

CS1061 - 「XmlDocument的」不包含「的SelectNodes」的定義,並沒有擴展方法「的SelectNodes」接受第一個參數型「的XmlDocument」的可以找到(是否缺少using指令或程序集引用?)(第16行)

CS1503 - 參數1:不能從「字符串」轉換爲「System.IO.Stream」 (第33行)

我考慮過的另一種方法是將第一個文件加載到數據集中,然後取第二個文件並將其加載到第二個數據集中。然後遍歷第二個數據集搜索第一個數據集中的代碼,如果發現更新該行,如果沒有,則添加該行。

這是我第一次使用C#並嘗試創建一個程序在服務器上運行。任何幫助和/或建議非常感謝。

+0

這是什麼類型的應用程序?你可以用XDocument來代替嗎? – sr28

+0

我想做一個.net應用程序。另外,我正在使用Visual Studios 2015. – cheshire

+0

你認爲重複的是什麼?一切都一樣嗎?或者它們都有唯一的代碼,例如只需要匹配就可以重複? – sr28

回答

1

使用LINQ to Xml
HashSet你可以識別重複的代碼。如果集合中已經存在相同的值,則HashSet.Add()將返回false。

var doc = XDocument.Load(yourPath); 
var codes = new HashSet<string>(); 

// .ToList() is important for removing elements 
foreach(var row in doc.Root.Elements("row").ToList()) 
{ 
    var code = row.Attribute("Code").Value; 
    var isUniqueCode = codes.Add(code); 
    if(isUniqueCode == false) 
    { 
     row.Remove(); 
    } 
} 

doc.Save(newPath); 
+0

當我嘗試這樣做時,我得到「'XDocument'在當前上下文中不存在」,如果我嘗試「XmlDocument」,則會出現幾個錯誤:「無法將void分配給隱式類型變量「和」非靜態字段,方法或屬性需要對象引用'XmlDocument.Load(string)'「 – cheshire

+0

使用System.Xml.Linq添加' – Fabio

+0

是否有另一個引用我需要爲ToList ()?這顯示爲現在沒有找到。 – cheshire

0

你可以在一個更簡單的方法做到這一點,嘗試這樣的事情:

var uniques = doc.Descendants("row").Attributes("Code").Distinct() 

我沒有測試過這雖然所以它可能需要一些修改

0

您可以使用XDocument代替,這是一個比較容易使用XmlDocument的。使用時,您需要以using System.Xml.Linq。然後簡單地按照「Code」屬性對LINQ to XML進行分組:

XDocument doc = XDocument.Load("U:\\Documents (U)\\XML Merging Tool\\productcollection_us.xml"); 

var uniqueProducts = doc.Root.Elements("row").GroupBy(x => (string)x.Attribute("Code"));