如何删除开始/结束元素
本文关键字:开始 结束 元素 删除 何删除 | 更新日期: 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" ... >
}