2013-07-26 17 views
5

के साथ सभी एक्सएमएल विशेषताओं को हटाएं मैं एक्सएमएल फाइलों की एक श्रृंखला संपादित कर रहा हूं, और मुझे "foo" नाम से सभी विशेषताओं को हटाने की जरूरत है। यह विशेषता एक से अधिक प्रकार के तत्व में प्रकट होती है। एक्सएमएल से एक उदाहरण का टुकड़ा हो सकता है:किसी दिए गए नाम

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

सबसे अच्छा समाधान मैं Regex का उपयोग करता है:

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

मैं पता निर्मित एक्सएमएल पारसर्स मदद कर सकता है, लेकिन आदर्श मैं सरल XML प्रतिस्थापन बनाना चाहते एक संपूर्ण एक्सएमएल पार्सर के सामान से निपटने के बिना/निकासी। क्या इस मामले में रेगेक्स सबसे अच्छा समाधान है?

संपादित:

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

रेगेक्स और एक्सएमएल मिश्रण नहीं करते हैं। –

+0

RegeXml, एक सुंदर चीज़ नहीं – Jonesopolis

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

उत्तर

7

एक्सएमएल मैनिपुलेशन के लिए रेगेक्स का उपयोग न करें। आप लिंक से एक्सएमएल का उपयोग कर सकते हैं:

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

मुझे लगा कि रेगेक्स एक अच्छा विचार नहीं था, लेकिन मैं अंतर्निहित XML पार्सर्स के लिए सभी विधि पुस्तकालयों के माध्यम से खुदाई करने के लिए अनिच्छुक था। अब मैं XmlDocument क्लास में देख रहा हूं, और मैं आपके यहां जो भी है उसका उपयोग भी कर सकता हूं। धन्यवाद! –

2

क्या इस मामले में रेगेक्स सबसे अच्छा समाधान है?

सं

आप string स्तर पर कुछ है कि वस्तु के स्तर पर एक्सएमएल पर काम करता है (एक XmlElement के रूप में, उदाहरण के लिए) और नहीं उपयोग करने के लिए चाहता हूँ।

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(); 
संबंधित मुद्दे