6
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;
                    }
                }
            }
        }
    }
}

TestXML 内容:

<a><b>26a83f12c782</b><c>128</c><d>12</d></a>

案例 b 永远不会被击中。但是如果我在 b 的结束元素之后添加一个空格,则会命中 case b。现在如何在不更改 xml 文件的情况下使其工作?

4

1 回答 1

10

这是您的代码的工作版本。纠正的具体问题包括:

  1. new XmlReader不编译。这是一个抽象类。您需要使用XmlTextReader或另一个XmlReader派生类。

  2. b 不是有效的 double。您试图将大的十六进制数直接转换为双精度数,这是不可能的。您可以NumberStyles.HexNumberParse通话中使用,但不能使用double,它必须是longor int

  3. 双读。您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;
                }
            }
        }
    }
    
    }
于 2010-10-13T02:15:31.757 回答