2013-07-26 25 views
5

我正在編輯一系列XML文件,並且需要刪除名稱爲「foo」的所有屬性。該屬性出現在多種類型的元素中。從XML的一個例子片斷可能是:使用給定名稱刪除所有XML屬性

<bodymatter id="######"> 
    <level1 id="######"> 
    <pagenum page="#####" id="######" foo="######" /> 
    <h1 id="#####" foo="#####">Header</h1> 
    <imggroup id="#######"> 
       . 
       . 
       etc. 

最好的解決方案我有使用正則表達式:

Regex regex = new Regex("foo=\"" + ".*?" + "\"", RegexOptions.Singleline); 
content = regex.Replace(content, ""); 

我知道內置XML解析器可以幫助,但最好我想使簡單的XML替換/清除而不必處理整個XML解析器的包袱。 在這種情況下,Regex是最好的解決方案嗎?

編輯

在XmlDocument類經過一番研究,這裏是一個可能的解決方案,我想出了(刪除存儲在陣列「IDS」不止一個屬性類型):

private void removeAttributesbyName(string[] ids) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(path); 
    XmlNodeList xnlNodes = doc.GetElementsByTagName("*"); 
    foreach (XmlElement el in xnlNodes) 
    { 
     for (int i = 0; i <= ids.Length - 1; i++) 
     { 
      if (el.HasAttribute(ids[i])) 
      { 
       el.RemoveAttribute(ids[i]); 
      } 
      if (el.HasChildNodes) 
      { 
       foreach (XmlNode child in el.ChildNodes) 
       { 
        if (child is XmlElement && (child as XmlElement).HasAttribute(ids[i])) 
        { 
         (child as XmlElement).RemoveAttribute(ids[i]); 
        } 
       } 
      } 
     } 
    } 
} 

我不知道這是否有效,因爲它可能是,但我已經測試它,它似乎工作正常。

+3

正則表達式和XML不能混用。 –

+0

RegeXml,不是漂亮的東西 – Jonesopolis

+0

我編輯過你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

7

不要使用正則表達式進行XML操作。您可以使用Linq到XML:

XDocument xdoc = XDocument.Parse(xml); 
foreach (var node in xdoc.Descendants().Where(e => e.Attribute("foo")!=null)) 
{ 
    node.Attribute("foo").Remove(); 
} 

string result = xdoc.ToString(); 
+0

我認爲Regex並不是一個好主意,但我不願意深入挖掘內置XML解析器的所有方法庫。現在我正在研究XmlDocument類,但是,我也可以利用你在這裏的內容。謝謝! –

2

Regex是這種情況下的最佳解決方案嗎?

你要使用的東西,在對象級別上的XML工作(爲XmlElement,例如),而不是在string水平。

0

我使用以下命令來刪除名稱空間。這也可能用於從其他節點中刪除屬性。

 FileStream fs = new FileStream(filePath, FileMode.Open); 

     StreamReader sr = new StreamReader(fs); 

     DataSet ds = new DataSet(); 
     ds.ReadXml(sr); 
     ds.Namespace = ""; 

     string outXML = ds.GetXml(); 
     ds.Dispose(); 
     sr.Dispose(); 
     fs.Dispose();