【问题标题】:C# XmlReader confused about assigning values from read() functionC# XmlReader 对从 read() 函数赋值感到困惑
【发布时间】:2018-03-23 00:04:48
【问题描述】:

有以下代码,这是新的,所以请善待,它看起来很笨重,并且没有返回我期望它返回的内容。基本上,我正在尝试将 Operator、Password 和 Group 值的节点读入 vars 并通过元组返回。

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>

【问题讨论】:

  • 向我们展示一个 xml 示例。
  • 以后请添加附加信息作为问题的编辑而不是 cmets。
  • 如果操作员和密码在同一个文件中,需要一些样本。
  • 在文件中流式传输,查找每个&lt;Security&gt; 元素,并使用XElement.ReadFrom() 查找它们将会容易得多。参见例如How to read large xml file without loading it in memory and using XElementGet the EndElement Node of an XElement.
  • 旁注:“...密码应该加密”在大多数情况下是一种糟糕的做法,尤其是在实施自制身份验证时...但您可能也已经知道了。

标签: c# xml tuples xmlreader


【解决方案1】:

在方法的开头放置一个断点,然后按 F11 逐步运行它。您将看到XmlReader 读取了Whitespace 节点等。请参阅 Debug > Windows > Autos 或 Locals 窗口。

您必须忽略这些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);
}

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 2021-12-31
    • 2021-04-27
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多