从大型html文件中获取元素
本文关键字:获取 元素 文件 大型 html | 更新日期: 2023-09-27 18:12:02
我有一个大的html文件(80个),像:
<html>
<head>...</head>
<body>
<div class="nothing">...</div>
<div class="content">
<h1>Hello</h1>
<div>
<div class="phone"> ... </div>
<div class="phone"> ... </div>
<div class="phone"> ... </div>
</div>
<div>
<div class="phone">
...
<div>
...
</div>
...
</div>
<div class="phone"> ... </div>
</div>
<div>
<div class="phone"> ... </div>
<div class="phone"> ... </div>
<div class="phone"> ... </div>
<div class="phone"> ... </div>
</div>
</div>
</body>
</html>
我不能手动修改这个html文件,所以最好是保持只读。
我想将<div class="phone"> ... </div>
的每一行存储在字符串表中,以便以后能够对其进行操作。在这个div中,还有其他元素可以是任何元素
- 我试图使用HtmlDocument和XmlDocument来加载这个文件,但文件是如此之大,我得到一个内存不足的异常
- 我试图使用Regex在一个表中获得所有这些元素,但我无法管理它。
我使用的正则表达式是:
Regex.Matches(myHtml, "<div class='"phone'">[''p{L}''s]*'',*[''p{L}''s]*<div");
这个正则表达式取每个
<div class="phone"> ANY UTF8 char </div>
但问题是:这个正则表达式接受所有UTF8字符,直到它找到下一个</div>
,但这个结束div不一定是第一个开始div的结束div。
你知道我该怎么做吗?难道我们不能把这个文件切成不同的字符串,以便能够在htmlDocument中加载吗?
谢谢。
可以使用XmlReader
类读取文件。XmlReader
不将整个文件加载到内存中,但允许您在动态解析文档时逐个节点地遍历XML文档。
示例:读取class = phone:
所有div的内容using (XmlReader reader = XmlReader.Create(@"C:'A.html"))
{
// Loop over all xml tags
while (reader.Read())
{
// Check we have a div whith attribute class = phone
if(reader.Name == "div" && reader.GetAttribute("class") == "phone")
{
// Yes, so read until the corresponding closing tag and output content
textBox1.AppendText(reader.ReadInnerXml() + Environment.NewLine);
}
}
}
详细信息请参考文档
你可以用jQuery循环phone
类的所有元素,并将它们存储在HiddenField
中。然后在PostBack中,你可以访问这些值并处理它们。
<asp:HiddenField ID="HiddenField1" runat="server" />
<script type="text/javascript">
function getValues() {
var valueArray = new Array();
var valueString = "";
$(".phone").each(function (index, element) {
//for demo store both in hiddenfield and javascript array
valueArray.push(element.innerHTML);
valueString += element.innerHTML + ",";
});
$("#<%=HiddenField1.ClientID %>").val(valueString);
}
</script>
和code-behind:
protected void Button1_Click(object sender, EventArgs e)
{
string valueString = HiddenField1.Value;
if (!string.IsNullOrEmpty(valueString))
{
string [] valueArray = valueString.TrimEnd(',').Split(',');
foreach (string s in valueArray)
{
//do stuff
}
}
}