我怀疑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() { }
}
答案 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" ... >
}