如何删除开始/结束元素

本文关键字:开始 结束 元素 删除 何删除 | 更新日期: 2023-09-27 18:10:17

我对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元素,如果元素名是'xyz'和'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() { }
}

如何删除开始/结束元素

如果我理解正确的话,你想从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>.*?)>"通过在开头匹配<,在一些文本之后以>结尾来查找元素,同时通过标记

匹配标记名称。

你可以处理表达式和更复杂的替换。

Replace方法允许您指定自己的MatchEvaluator,以便进行更复杂的替换

XML Writer方法

这里所请求的

是使用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" ... >,那么将以下覆盖添加到您的writer类

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