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);
}
有以下代码,这是新手,所以请善待它,它看起来很笨重,并且 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);
}