2013-07-26 11 views
5

Sto modificando una serie di file XML e ho bisogno di rimuovere tutti gli attributi con il nome "pippo". Questo attributo appare in più di un tipo di elemento. Un frammento di esempio dal XML potrebbe essere:Rimuovi tutti gli attributi XML con un nome dato

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

La soluzione migliore che hanno usi Regex:

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

So built-in parser XML potuto fare, ma idealmente voglio fare semplici sostituzioni XML/traslochi senza dover affrontare il bagaglio di un intero parser XML. Regex è la soluzione migliore in questo caso?

Edit:

Dopo alcune ricerche nella classe XmlDocument, ecco una possibile soluzione mi è venuta (per rimuovere più di un tipo di attributo memorizzato nella matrice "id"):

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]); 
        } 
       } 
      } 
     } 
    } 
} 

Non so se questo è il più efficiente possibile, ma l'ho provato e sembra funzionare bene.

+3

Regex e XML non si mescolano. –

+0

RegeXml, non una cosa carina – Jonesopolis

+0

Ho modificato il tuo titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –

risposta

7

Non utilizzare regex per la manipolazione XML. È possibile utilizzare LINQ to 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

Ho pensato che Regex non fosse una buona idea, ma ero riluttante a scavare attraverso tutte le librerie dei metodi per i parser XML incorporati. Ora sto esaminando la classe XmlDocument, tuttavia, e potrei anche fare uso di ciò che hai qui. Grazie! –

2

Regex è la soluzione migliore in questo caso?

No.

Ti consigliamo di utilizzare qualcosa che funziona su XML a livello di oggetto (come XmlElement, per esempio) e non a livello string.

0

Io uso il seguente per rimuovere gli spazi dei nomi. Questo potrebbe funzionare anche nella rimozione di attributi da altri nodi.

 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(); 
Problemi correlati