使用C#从html中删除自定义xml标记

时间:2015-10-30 10:58:34

标签: c# html regex xml parsing

我有一个包含一些HTML代码的字符串。但是我需要将该html解析为XDocument

string input = String.Concat("<root>", htmlString, "</root>");
var doc = XDocument.Parse(input);

但有时在我的htmlString中会有像<o:p></o:p>之类的标签,而XDocument.Parse()中的标签会出现异常:

  

':'字符,十六进制值0x3A,不能包含在a中   名称。第1行,第650位。

如何删除标记或至少替换标记名称中的':'

在进行解析之前,我正在尝试删除/替换':',但它无效:

try
{
    Regex regex = new Regex(@"<[:][^>]+>.+?</\[:]>");
    while (regex.IsMatch(htmlString))
    {
        htmlString= regex.Replace(htmlString, "");
    }
}
catch { }

HTML示例

<p>Some text</p>

<p class="MsoNormal" style="TEXT-ALIGN: justify; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%">
    <?xml:namespace prefix="o" ns="urn:schemas-microsoft-com:office:office"?>
    <o:p> </o:p>
</p>

<p>More text</p>

更新

我正在使用HtmlAgilityPack,但它不会删除此标记。

我的代码

ConfigureHtmlDocument();

var htmlDoc = new HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
htmlDoc.LoadHtml(htmlString);

var htmlError = htmlDoc.ParseErrors.SafeAny();

if (!htmlError)
    htmlString= htmlDoc.DocumentNode.InnerHtml;

try
{
    Regex regex = new Regex(@"<[:][^>]+>.+?</\[:]>");
    while (regex.IsMatch(htmlString))
    {
        htmlString= regex.Replace(htmlString, "");
    }
}
catch { }

string input = String.Concat("<root>", htmlString, "</root>");
var doc = XDocument.Parse(input);

//more code

ConfigureHtmlDocument()

    if (!HtmlNode.ElementsFlags.ContainsKey("p"))
        HtmlNode.ElementsFlags.Add("p", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["p"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("ul"))
        HtmlNode.ElementsFlags.Add("ul", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["ul"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("li"))
        HtmlNode.ElementsFlags.Add("li", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["li"] = HtmlElementFlag.Closed;

    if (!HtmlNode.ElementsFlags.ContainsKey("ol"))
        HtmlNode.ElementsFlags.Add("ol", HtmlElementFlag.Closed);
    else
        HtmlNode.ElementsFlags["ol"] = HtmlElementFlag.Closed;

    //more similar code

2 个答案:

答案 0 :(得分:0)

解决! 正则表达式是错误的。我用这个替换了表达式:

//for remove xml declarations
htmlString = Regex.Replace(texto, @"<\?xml.*\?>", "");

//for remove costum tags like <o:p> and </o:p>
htmlString = Regex.Replace(texto, @"<(?:[\S]\:[\S])[^>]*>", "");
htmlString = Regex.Replace(texto, @"</(?:[\S]\:[\S])[^>]*>", ""); 

现在它有效!

答案 1 :(得分:0)

如果你事先知道命名空间,你可以做这样简单的事情:

htmlString = htmlString.Replace("<o:", "<").Replace("</o:", "</");