2014-06-25 69 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

相关问题