static void ReadXml()
{
string a= null;
double b= 0;
double c= 0;
XmlReader xmlReader = new XmlReader("Testxml.xml");
xmlReader.
using (xmlReader)
{
if (xmlReader != null)
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
switch (xmlReader.Name)
{
case "a":
a = xmlReader.ReadElementContentAsString();
break;
case "b":
b = double.Parse(xmlReader.ReadElementContentAsString());
break;
case "c":
c = double.Parse(xmlReader.ReadElementContentAsString());
break;
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
TestXML内容:
<a><b>26a83f12c782</b><c>128</c><d>12</d></a>
Run Code Online (Sandbox Code Playgroud)
情况b从未被击中.但是如果我在b的结束元素之后添加一个空格,则会触发案例b.现在如何在不更改xml文件的情况下使其工作?
Sam*_*eff 10
这是您的代码的工作版本.纠正的具体问题包括:
new XmlReader不编译.这是一个抽象类.您需要使用XmlTextReader或其他XmlReader派生类.
b不是有效的双倍.您试图直接将大十六进制数转换为双数,这是不可能的.您可以NumberStyles.HexNumber在Parse通话中使用,但不能使用double,必须是long或int.
双读.你Read()在循环中调用,但后来也使用了这些XmlReader.ReadXxx()方法.这称为读取额外时间和跳过节点.这确实是你要问的主要问题.以下代码跟踪找到的最后一个元素,然后等待它到达Text节点进行处理.这对于简单/平面文档很好,但对于更复杂的文档,您需要一种更好的跟踪状态的方法,比如有限状态机.或者使用DOM.或者LINQ.
static void ReadXml()
{
string a = null;
long b = 0;
double c = 0;
string text = "<a><b>26a83f12c782</b><c>128</c><d>12</d></a>";
string element = "";
using (XmlReader xmlReader = new XmlTextReader(new StringReader(text)))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
element = xmlReader.Name;
}
else if (xmlReader.NodeType == XmlNodeType.Text)
{
switch (element)
{
case "a":
a = xmlReader.Value;
Console.WriteLine("a: " + a);
break;
case "b":
b = long.Parse(xmlReader.Value, NumberStyles.HexNumber);
Console.WriteLine("b: " + b);
break;
case "c":
c = double.Parse(xmlReader.Value);
Console.WriteLine("c: " + c);
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
20547 次 |
| 最近记录: |