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 の end 要素の後にスペースを追加すると、ケース b がヒットします。xmlファイルを変更せずに機能させるにはどうすればよいですか?

4

1 に答える 1

10

これがあなたのコードの作業バージョンです。修正される具体的な問題は次のとおりです。

  1. new XmlReaderコンパイルしません。抽象クラスです。XmlTextReaderまたは別のXmlReader派生クラスを使用する必要があります。

  2. b は有効な double ではありません。大きな 16 進数を double に直接変換しようとしましたが、これは不可能です。呼び出しで使用できますNumberStyles.HexNumberが、 では使用できません。またはである必要があります。Parsedoublelongint

  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 に答える