6

我是一名初级程序员,从 C# 和 Web 服务开始。

Service.cs我的 Web 服务文件中,我创建了一个ReadXMLFile()方法,我试图在其中读取现有 XML 文件,从中获取数据并将其放置到我在IService.cs文件中创建的相应属性 (DataMembers) 中。

我的问题是我的代码基本上没有做任何事情。我试过寻找这方面的网站和教程,但那里真的没有太多,尤其是对于像我这样的初学者。任何人都知道我应该怎么做,因为到目前为止我一直在尝试的显然是错误的。

下面是我的ReadXMLFile()方法。

void ReadXMLFile()
{
    XmlTextReader reader = new XmlTextReader("ClassRoll.xml");
    reader.Read();
    while (reader.Read())
    {
        if (reader.Name == "id")
        {
            id = reader.ReadString();
        }
        else if (reader.Name == "firstname")
        {
            link = reader.ReadString();
        }
        else if (reader.Name == "lastname")
        {
            description = reader.ReadString();
        }
        else if (reader.Name == "count")
        {
            description = reader.ReadString();
        }
        else if (reader.Name == "testscore")
        {
            description = reader.ReadString();
        }
    }
}

这是我的 xml 文件的示例

<classroll>
  <student>
    <id>101010</id>
    <lastname>Smith</lastname>
    <firstname>Joe</firstname>
    <testscores count="5">
      <score>65</score>
      <score>77</score>
      <score>67</score>
      <score>64</score>
      <score>80</score>
    </testscores>
  </student>
</classroll>
4

3 回答 3

5

您可能在 while 循环中缺少 IsStartElement() 条件:

while (reader.Read())
{
    if (reader.IsStartElement())
    {
       if (reader.Name == "id")
       {
           id = reader.ReadString();
       }
...
}

此外,使用XPathLINQ to XML读取 XML会更容易,当然这取决于文件。以下是一些示例:XPathLINQ

编辑:查看 XML 文件详细信息后

您应该更新您的逻辑以跟踪当前student及其testscores. 另外,请注意这count是一个属性。它很快就会变得混乱,我建议你看看上面提到的示例。

于 2012-04-14T04:03:50.077 回答
3

我认为,您使用 XmlDocument 获得最佳结果

public void ReadXML()
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("<name file>.xml");
    xmlEntities = new List<XmlEntity>();

    foreach(XmlNode item in xmlDoc.ChildNodes)
    {
        GetChildren(item);
    }
}

private void GetChildren(XmlNode node)
{
    if (node.LocalName == "Строка")
    {
       //<you get the element here and work with it>
    }
    else
    {
       foreach (XmlNode item in node.ChildNodes)
       {
             GetChildren(item);
       }
    }
}
于 2013-03-15T09:30:57.360 回答
0

它不起作用的原因是,例如:当 reader.Name == "firstname" 为 true 但其元素值不为 true 时。它的确切含义是 reader 对象读取下一个 Nodetype,即 XmlNodeType.Element。因此,在这种情况下,使用 reader.Read(); 查看您的 XML 文件 函数再次读取下一个节点,即 XmlNodeType.Text,其值为 Joe。我给你一个工作版本的例子。

void ReadXMLFile()
{
XmlTextReader reader = new XmlTextReader("ClassRoll.xml");
reader.Read();
while (reader.Read())
{
    if (reader.Name == "id")
    {
         reader.Read();
         if(reader.NodeType == XmlNodeType.Text)
         {
           id = reader.Value;
           reader.Read();
         }

    }
 }

}

于 2014-01-09T12:22:51.090 回答