如何删除开始/结束元素

时间:2014-06-25 11:56:52

标签: c# .net xml openxml xmlwriter

我怀疑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() { }
}

1 个答案:

答案 0 :(得分: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>.*?)>"通过匹配<开头,跟随一些文本并以>结尾,同时通过标记<匹配标记名称来查找元素< / p>

您可以处理表达式并替换更复杂的替换。

替换方法可让您为更复杂的替换项指定自己的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" ... >,请将以下oveerride添加到您的编写者类

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