加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – XMLTextReader不读取元素内容

发布时间:2020-12-15 08:45:08 所属栏目:百科 来源:网络整理
导读: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.E
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的结束元素之后添加一个空格,则会触发案例b.现在如何在不更改xml文件的情况下使其工作?

解决方法

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

>新的XmlReader无法编译.这是一个抽象类.您需要使用XmlTextReader或其他XmlReader派生类.
> b不是有效的双倍.您试图直接将大十六进制数转换为双数,这是不可能的.您可以在Parse调用中使用NumberStyles.HexNumber,但不能使用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;
            }
        }
    }
}

}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读