C# XmlReader无法读取所有节点
我正在为我的一个需求编写一个自定义XML解析。该程序的目的是解析与主节点匹配的任何类型的XML文件。 我已将问题复制如下。 ReadXml(),ParseData()方法的主要目的是读取XML元素的数据,如果发现匹配项,则应前进到下一个节点。 但是输入XML有一个额外的节点“title1”,因为这个节点,解析程序在没有读取“author”节点的情况下中断C# XmlReader无法读取所有节点,c#,xml,C#,Xml,我正在为我的一个需求编写一个自定义XML解析。该程序的目的是解析与主节点匹配的任何类型的XML文件。 我已将问题复制如下。 ReadXml(),ParseData()方法的主要目的是读取XML元素的数据,如果发现匹配项,则应前进到下一个节点。 但是输入XML有一个额外的节点“title1”,因为这个节点,解析程序在没有读取“author”节点的情况下中断 class Program { static void Main() { StringBuilder o
class Program
{
static void Main()
{
StringBuilder output = new StringBuilder();
String xmlString =
@"<bookstore>
<book genre='autobiography' publicationdate='1981-03-22' ISBN='1-861003-11-0'>
<title>The Autobiography of Benjamin Franklin</title>
<title1>The Autobiography of Benjamin Franklin</title1>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<author2>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author2>
<price>8.99</price>
</book>
</bookstore>";
// Create an XmlReader
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
ReadXml(reader);
}
}
public static void ReadXml(System.Xml.XmlReader reader)
{
if (reader.MoveToContent() == XmlNodeType.Element &&
reader.LocalName == "bookstore")
{
reader.Read();
// Parse the file and display each of the nodes.
do
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
ParseData(reader);
break;
case XmlNodeType.Text:
case XmlNodeType.CDATA:
case XmlNodeType.ProcessingInstruction:
case XmlNodeType.Comment:
case XmlNodeType.XmlDeclaration:
case XmlNodeType.Document:
case XmlNodeType.EntityReference:
case XmlNodeType.EndElement:
break;
}
if (reader.ReadState == ReadState.Interactive)
reader.Read();
} while (!reader.EOF && reader.NodeType != XmlNodeType.EndElement);
}
}
protected static bool ParseData(System.Xml.XmlReader reader)
{
string output = string.Empty;
bool parsed = true;
switch (reader.LocalName)
{
case "title":
output = reader.ReadString();
break;
case "author":
XmlReader reagentListReader = reader.ReadSubtree(); // This case never reached
break;
default:
// output = reader.ReadString(); //uncomment will work,But //not sure to read subtree or string.
parsed = false;
break;
}
return parsed;
}
}
类程序
{
静态void Main()
{
StringBuilder输出=新的StringBuilder();
字符串xmlString=
@"
本杰明·富兰克林自传
本杰明·富兰克林自传
本杰明
富兰克林
本杰明
富兰克林
8.99
";
//创建一个XmlReader
使用(XmlReader=XmlReader.Create(新StringReader(xmlString)))
{
ReadXml(reader);
}
}
公共静态void ReadXml(System.Xml.XmlReader)
{
if(reader.MoveToContent()==XmlNodeType.Element&&
reader.LocalName==“书店”)
{
reader.Read();
//解析文件并显示每个节点。
做
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
解析数据(读卡器);
打破
案例XmlNodeType.Text:
案例XmlNodeType.CDATA:
案例XmlNodeType.ProcessingInstruction:
案例XmlNodeType.Comment:
案例XmlNodeType.XmlDeclaration:
案例XmlNodeType.Document:
案例XmlNodeType.EntityReference:
案例XmlNodeType.EndElement:
打破
}
if(reader.ReadState==ReadState.Interactive)
reader.Read();
}而(!reader.EOF&&reader.NodeType!=XmlNodeType.EndElement);
}
}
受保护的静态bool ParseData(System.Xml.XmlReader)
{
字符串输出=string.Empty;
bool parsed=true;
开关(reader.LocalName)
{
案例“标题”:
输出=reader.ReadString();
打破
案例“作者”:
XmlReader reagentListReader=reader.ReadSubtree();//从未达到这种情况
打破
违约:
//output=reader.ReadString();//取消注释将起作用,但//不确定是否读取子树或字符串。
解析=假;
打破
}
返回解析;
}
}
通过添加“output=reader.ReadString();”默认情况下:switch case解决了我的问题,但我从来不知道它是用来读取子树或字符串的。问题在于您的循环条件-当它到达
EndElement时,您正在退出。如果您单步执行,您可以验证这一点-它将作为读取器被忽略的元素访问。Read
被调用
只需将条件更改为:
while (!reader.EOF);
你这样解析有什么原因吗?“真实”文件是否非常大?是的,真实文件更大,可以扩展到任何大小。真实的文件可以由不同的用户更新并发送给客户。软件应在任何特定情况下处理新的XML。如果要忽略某些标记,则应读取整个子树。此外,在忽略列表中添加空格。这是可行的,但文件大小和程序性能是一个问题。您能否解释为什么reader.read()不是移动到下一个节点,而是迭代文本endelement。这就是它的工作方式,它按顺序读取所有部分,例如元素、属性、内容(可能包含更多元素),然后是结束元素。