XML 使用 XMLReader 和 foreach 进行解析
XML parsing using XMLReader and foreach
我想解析以下作为字符串输入的 XML 文件。
<leadtools_form_processing_fields>
<pages>
<page number="1" dpix="300" dpiy="300">
<fields>
<field type="Leadtools.Forms.Processing.TextFormField, Leadtools.Forms.Processing>
<values>
<value name="LastName" />
<value bounds="232, 875, 736, 76 Pixel" />
<value dropOut="None" />
<value regex_pattern="" />
<value ocr_text_type="FlowText" />
<value enable_icr="False" />
<value enable_ocr="True" />
<value text_field_type="Character" />
</values>
</field>
<field type="Leadtools.Forms.Processing.TextFormField, Leadtools.Forms.Processing>
<values>
<value name="MiddleName" />
<value bounds="1112, 875, 475, 76 Pixel" />
<value dropOut="None" />
<value regex_pattern="" />
<value ocr_text_type="FlowText" />
<value enable_icr="False" />
<value enable_ocr="True" />
<value text_field_type="Character" />
</values>
</field>
</fields>
</page>
</pages>
</leadtools_form_processing_fields>
我想 XMLReader 比 XMLDocument 效率更高。如何获取 'values' 元素中元素的值并使用 XMLReader 和 foreach.
解析其他元素
我试过这个:(某种伪代码)
using (XmlReader reader = XmlReader.Create(xmlData))
{
while (reader.Read())
{
reader.ReadToFollowing("pages");
foreach (XmlElement Page in Pages)
{
pageNumber = Page.GetAttribute("number");
reader.ReadToFollowing("fields");
foreach (XmlElement field in fields)
{
type = Page.GetAttribute("type");
reader.ReadToFollowing("values");
foreach (XmlElement value in values)
{
name = value.GetAttribute("name");
string bounds = value.GetAttribute("bounds");
string boundValues[] = bounds.Split(,);
x = boundValues[0];
y = boundValues[1];
width = boundValues[2];
height = boundValues[3];
}
formFields.Add(new FormField() { Name = name, X = x, Y = y, Width = width, Height = height, PageNumber = pageNumber, FormFieldType = type });
}
}
谢谢!
XmlReader
无法使用 foreach 循环。您可以使用类似于以下的代码:
using (XmlReader reader = XmlReader.Create(filepath))
{
while (reader.ReadToFollowing("page"))
{
pageNumber = reader.GetAttribute("number");
while (reader.ReadToFollowing("field"))
{
type = reader.GetAttribute("type");
reader.ReadToFollowing("value");
name = reader.GetAttribute("name");
reader.ReadToFollowing("value");
string bounds = reader.GetAttribute("bounds");
string[] boundValues = bounds.Split(' ');
x = boundValues[0].Trim(',');
y = boundValues[1].Trim(',');
width = boundValues[2].Trim(',');
height = boundValues[3];
formFields.Add(new FormField() { Name = name, X = x, Y = y, Width = width, Height = height, PageNumber = pageNumber, FormFieldType = type });
}
}
}
在 while 循环中使用 ReadToFollowing
方法遍历节点。
我想解析以下作为字符串输入的 XML 文件。
<leadtools_form_processing_fields>
<pages>
<page number="1" dpix="300" dpiy="300">
<fields>
<field type="Leadtools.Forms.Processing.TextFormField, Leadtools.Forms.Processing>
<values>
<value name="LastName" />
<value bounds="232, 875, 736, 76 Pixel" />
<value dropOut="None" />
<value regex_pattern="" />
<value ocr_text_type="FlowText" />
<value enable_icr="False" />
<value enable_ocr="True" />
<value text_field_type="Character" />
</values>
</field>
<field type="Leadtools.Forms.Processing.TextFormField, Leadtools.Forms.Processing>
<values>
<value name="MiddleName" />
<value bounds="1112, 875, 475, 76 Pixel" />
<value dropOut="None" />
<value regex_pattern="" />
<value ocr_text_type="FlowText" />
<value enable_icr="False" />
<value enable_ocr="True" />
<value text_field_type="Character" />
</values>
</field>
</fields>
</page>
</pages>
</leadtools_form_processing_fields>
我想 XMLReader 比 XMLDocument 效率更高。如何获取 'values' 元素中元素的值并使用 XMLReader 和 foreach.
解析其他元素我试过这个:(某种伪代码)
using (XmlReader reader = XmlReader.Create(xmlData))
{
while (reader.Read())
{
reader.ReadToFollowing("pages");
foreach (XmlElement Page in Pages)
{
pageNumber = Page.GetAttribute("number");
reader.ReadToFollowing("fields");
foreach (XmlElement field in fields)
{
type = Page.GetAttribute("type");
reader.ReadToFollowing("values");
foreach (XmlElement value in values)
{
name = value.GetAttribute("name");
string bounds = value.GetAttribute("bounds");
string boundValues[] = bounds.Split(,);
x = boundValues[0];
y = boundValues[1];
width = boundValues[2];
height = boundValues[3];
}
formFields.Add(new FormField() { Name = name, X = x, Y = y, Width = width, Height = height, PageNumber = pageNumber, FormFieldType = type });
}
}
谢谢!
XmlReader
无法使用 foreach 循环。您可以使用类似于以下的代码:
using (XmlReader reader = XmlReader.Create(filepath))
{
while (reader.ReadToFollowing("page"))
{
pageNumber = reader.GetAttribute("number");
while (reader.ReadToFollowing("field"))
{
type = reader.GetAttribute("type");
reader.ReadToFollowing("value");
name = reader.GetAttribute("name");
reader.ReadToFollowing("value");
string bounds = reader.GetAttribute("bounds");
string[] boundValues = bounds.Split(' ');
x = boundValues[0].Trim(',');
y = boundValues[1].Trim(',');
width = boundValues[2].Trim(',');
height = boundValues[3];
formFields.Add(new FormField() { Name = name, X = x, Y = y, Width = width, Height = height, PageNumber = pageNumber, FormFieldType = type });
}
}
}
在 while 循环中使用 ReadToFollowing
方法遍历节点。