C# XmlReader 对从 read() 函数赋值感到困惑

C# XmlReader confused about assigning values from read() function

有以下代码,这是新手,所以请善待它,它看起来很笨重,并且 return 不是我期望的 return。基本上,我试图通过元组将运算符、密码和组值的节点读取到 vars 和 return 中。

public static Tuple<string, string, string> ReadSecurity()
{            
    XmlReader reader = XmlReader.Create("Operator.xml");
    string sOperator = "";
    string sPassword = "";
    string sGroup = "";

    while (reader.Read())
    {
        if(reader.NodeType == XmlNodeType.Element && reader.Name == "Security")
        {
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.Read();
                if (reader.NodeType == XmlNodeType.Text)
                {
                    sOperator = reader.Value;
                }

                reader.Read();
                if (reader.NodeType == XmlNodeType.Text)
                {
                    sPassword = reader.Value;
                }

                reader.Read();
                if (reader.NodeType == XmlNodeType.Text)
                {
                    sGroup = reader.Value;
                }
            }
        }
    }
    return Tuple.Create(sOperator, sPassword, sGroup);
}

似乎每次都缺少第一个值,但不知道如何更改它,在线教程假设的知识比我目前掌握的要多得多。

例如:
请参阅下面的当前迭代(是的,我知道密码应该被加密)。

<?xml version="1.0" encoding="utf-8"?> 
<Security ver="beta"> 
    <Operator>Ted</Operator> 
    <Password>password</Password> 
    <Group>op</Group> 
</Security>

在您的方法开头放置一个断点,然后 运行 按 F11 逐步执行。您将看到 XmlReader 读取 Whitespace 节点等。请参见调试 > Windows > 自动或本地 window。

您必须忽略这些 Whitespace 节点并正确导航到 Text 类型的节点以读取它们的值。您还需要正确处理开始和结束标记。

因此,代码可能如下所示:

using (var reader = XmlReader.Create("Operator.xml"))
{
    string sOperator = "";
    string sPassword = "";
    string sGroup = "";

    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && reader.Name == "Operator")
        {
            reader.Read(); // move to Text node
            sOperator = reader.Value;
        }

        if (reader.NodeType == XmlNodeType.Element && reader.Name == "Password")
        {
            reader.Read(); // move to Text node
            sPassword = reader.Value;
        }

        if (reader.NodeType == XmlNodeType.Element && reader.Name == "Group")
        {
            reader.Read(); // move to Text node
            sGroup = reader.Value;
        }
    }

    return Tuple.Create(sOperator, sPassword, sGroup);
}

然而 XmlReader class 有很多有用的方法。如果你正确使用它们,你可以使它的使用变得简单和愉快。

using (var reader = XmlReader.Create("Operator.xml"))
{
    reader.ReadToFollowing("Operator");
    var sOperator = reader.ReadElementContentAsString();

    reader.ReadToFollowing("Password");
    var sPassword = reader.ReadElementContentAsString();

    reader.ReadToFollowing("Group");
    var sGroup = reader.ReadElementContentAsString();

    return Tuple.Create(sOperator, sPassword, sGroup);
}