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

C#XmlReader对从read()函数赋值感到困惑,c#,xml,tuples,xmlreader,C#,Xml,Tuples,Xmlreader,有下面的代码,这是新的,所以要友好,它看起来笨重,并没有返回我期望它返回的。基本上,我试图将操作符、密码和组值的节点读入变量,并通过元组返回 public static Tuple<string, string, string> ReadSecurity() { XmlReader reader = XmlReader.Create("Operator.xml"); string sOperator = ""; string sPass

有下面的代码,这是新的,所以要友好,它看起来笨重,并没有返回我期望它返回的。基本上,我试图将操作符、密码和组值的节点读入变量,并通过元组返回

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);
}
公共静态元组ReadSecurity()
{            
XmlReader=XmlReader.Create(“Operator.xml”);
字符串sOperator=“”;
字符串sPassword=“”;
字符串sGroup=“”;
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Element&&reader.Name==“安全性”)
{
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;
}
}
}
}
返回Tuple.Create(sOperator、sPassword、sGroup);
}
似乎每次都缺少第一个值,但不知道如何改变这一点,在线教程假设的知识比我目前拥有的要多得多

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


特德
密码
op

在方法的开头放一个断点,然后按F11一步一步地运行它。您将看到
XmlReader
读取
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
类有许多有用的方法。如果你正确地使用它们,你可以使它的使用变得简单和愉快

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

给我们看一个xml示例。以后请添加其他信息作为对问题的编辑,而不是注释。如果操作符和密码在同一个文件中,则需要一些示例。在文件中进行流式处理、查找每个
元素以及使用
XElement.ReadFrom()
查找这些元素会容易得多。请参见示例和旁注:“……密码应加密”对于大多数情况来说都是糟糕的做法,尤其是对于实现自制身份验证而言。。。但你可能已经知道了。
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);
}