2014-06-25 111 views
0

我懷疑在c#中sgmlReading/XmlWriting,我正在寫幾個基於條件的startElement,EndElement。如何刪除開始/結束元素

如果我不想寫特定的標籤,但我需要內在的Xml,如何去除標籤?,請幫助解決這個問題!

這是我的示例XML:

<BODY> 
    <p><l>bla bla</li></p> 
    <h1><p2>bla bla</p2></h1> 
    <xyz>bla bla<p3>bla bla</p3>bla bla</xyz> 
    <abc><p3>bla bla</p3></abc> 
</BODY> 

在這裏,我通過一個讀取XML元素之一,如果元素的名稱是「某某」和「ABC」,我不想寫的元素名稱。

 public class XMLWriter : XmlTextWriter 
    { 
     //if element name this is following strings, i don't want to write element name. 
     public static string[] notAllowedTags = new string[] { "xyz", "abc"} 

     public override void WriteStartElement(string prefix, string localName, string ns) 
      { 
        bool doWrite = true; 
        string tagLocalName = localName; 

        foreach (string name in notAllowedTags) 
        { 
         if (name == tagLocalName) 
         { 
          doWrite = false; 
          break; 
         } 
        } 

        if (doWrite) 
        { 
         localName = tagLocalName; 
         openingElement = localName; 
         base.WriteStartElement(prefix, localName, ns); 
        } 

        else 
        { 
         //base.WriteStartElement(prefix, localName, ns); 
//else condition i don't want to write element, if i keep empty, 
        } 
      } 


     //this is for write start element 
     public override void WriteEndElement() 
     { 
     } 

    } 

感謝&問候,

薩蘭

+1

你可以把你的XML文件 –

+0

這真的很難理解你要完成的任務。請提供您想要製作的示例。 –

+0

K.B和Jim Mischel,我修改了我的問題,請幫我解決這個問題。 –

回答

0

如果我理解你正確,您要刪除從XML離開HTML的所有元素背後

你可以使用正則表達式同樣的

樣本

void test() 
{ 

    string result = Regex.Replace(xmlString, @"</*(?<tag>.*?)>", MyMatchEvaluator); 
} 

private string MyMatchEvaluator(Match m) 
{ 
    string tag = m.Groups["tag"].Value; 
    string result = m.Value; 
    switch (tag) 
    { 
     case "xyz": 
     case "abc": 
      result = string.Empty; 
      break; 
      //more cases if needed 
    } 
    return result; 
} 

結果

<BODY> 
    <p><l>bla bla</li></p> 
    <h1><p2>bla bla</p2></h1> 
    bla bla<p3>bla bla</p3>bla bla 
    <p3>bla bla</p3> 
</BODY> 
上述樣品的正則表達式 @"</*(?<tag>.*?)>"是通過在開頭匹配 <,以下一些文本,而經由標籤匹配標籤名稱與 >結束尋找一個元件在

您可以處理更復雜替換的表達和替換。

更換方法爲你提供指定自己MatchEvaluator用於更復雜的替代

XML編寫方法

這裏要求是使用XMLWriter就來達到同樣的

void test() 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<BODY><p><li>bla bla</li></p><h1><p2>bla bla</p2></h1><xyz>bla bla<p3>bla bla</p3>bla bla</xyz><abc><p3>bla bla</p3></abc></BODY>"); 

     MyXMLWriter writer = new MyXMLWriter("c:\\out.xml"); 
     doc.Save(writer); 
     writer.Flush(); 
     writer.Close(); 
    } 

    public class MyXMLWriter : XmlTextWriter 
    { 
     Stack<string> elementStack = new Stack<string>(); 
     public static string[] notAllowedTags = new string[] { "xyz", "abc" }; 

     public MyXMLWriter(string fileName) 
      : base(fileName, Encoding.UTF8) 
     { 

     } 

     public override void WriteStartElement(string prefix, string localName, string ns) 
     { 
      if (!notAllowedTags.Contains(localName)) 
      { 
       base.WriteStartElement(prefix, localName, ns); 
      } 
      elementStack.Push(localName); 
     } 

     public override void WriteFullEndElement() 
     { 
      string tagLocalName = elementStack.Pop(); 
      if (!notAllowedTags.Contains(tagLocalName)) 
      { 
       base.WriteFullEndElement(); 
      } 
     } 

     public override void WriteEndElement() 
     { 
      string tagLocalName = elementStack.Pop(); 
      if(!notAllowedTags.Contains(tagLocalName)) 
      { 
       base.WriteEndElement(); 
      } 
     } 
    } 
方式

結果

<?xml version="1.0" encoding="utf-8"?> 
<BODY> 
    <p> 
     <li>bla bla</li> 
    </p> 
    <h1> 
     <p2>bla bla</p2> 
    </h1>bla bla<p3>bla bla</p3>bla bla<p3>bla bla</p3> 
</BODY> 

,如果你不希望看到的<?xml version="1.0" ... >然後添加以下oveerride您作家班

 public override void WriteStartDocument() 
     { 
      //skip <?xml version="1.0" ... > 
     } 
+0

謝謝Purshpraj快速回復,目前,我是以同樣的方式,我不想通過正則表達式,並替換方法,我想通過xmlwriter方法 –

+0

確定,讓我試着帶上xml編寫器方法爲你。 – pushpraj

+0

只要檢查出來,如果更新的答案是你正在尋找的? – pushpraj

相關問題