我有一个包含一些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
答案 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:", "</");