【发布时间】:2012-07-27 15:20:21
【问题描述】:
我有一个带有未封闭 <LI> 元素的 HTML 文档。我需要将</LI> 附加到每个</OBJECT> 的末尾,然后是打开<LI> 标记。
注意: 前面没有<LI> 的对象不应在</OBJECT> 后面附加</LI> 标签
<OBJECT value="example">
<param name="Joe">
</OBJECT>
<UL>
<LI> <OBJECT type="example">
<param name="Pat">
<param name="State" value="Arizona">
</OBJECT>
<UL>
<LI> <OBJECT type="example">
<param name="Steve">
<param name="State" value="California">
</OBJECT>
<OBJECT type="text/sitemap">
<param name="Carol">
</OBJECT>
这是我到目前为止没有运气的结果
private void closeListItems(string doc)
{
StringBuilder sb = new StringBuilder();
Regex rx = new Regex("(<LI>.(.+?)</OBJECT>)", RegexOptions.Multiline | RegexOptions.IgnoreCase);
string[] hhcFile = File.ReadAllLines(doc);
string temp = "";
foreach (string line in hhcFile)
{
temp += line + "\n";
}
temp = rx.Replace(temp, "<LI>");
StreamWriter sw = new StreamWriter(Application.StartupPath + "\\liFix.txt");
sw.Write(temp);
sw.Close();
}
更新:我也试过了,但没有运气:
private void closeListItems(string doc)
{
StringBuilder sb = new StringBuilder();
string[] hhcFile = File.ReadAllLines(doc);
string temp = "";
bool liOpen = false;
foreach (string line in hhcFile)
{
temp = line;
if (line.Contains("<LI>"))
{
liOpen = true;
}
if (line.Contains("</OBJECT>") && liOpen == true)
{
temp.Replace(temp, temp + "</LI>");
liOpen = false;
}
sb.Append("\n" + temp);
}
File.WriteAllText("fixLi.txt", sb.ToString());
}
【问题讨论】:
-
我有一个 HTML 文档,其中包含未封闭的
<LI>元素。 — 不,你没有。 li 元素的结束标记在 HTML 中是可选的,因此它们是封闭的(只是没有明确地)。 -
这是有效的 HTML,结束
</li>是可选的。为什么需要这样做? -
HtmlAgilityPack 无法正确解析未关闭的 LI 标记(尽管我努力通过源代码重新编译 HAP 并进行修改以修复它)。
- 标签区分我需要使用 XPATH 解析的两种类型的对象。
-
@Quentin "...解析有限的已知 HTML 集有时是合适的。"