【问题标题】:retrieving data from xml file and posting it to listbox从 xml 文件中检索数据并将其发布到列表框
【发布时间】:2013-10-08 20:17:34
【问题描述】:

我正在尝试从我的 xml 文件中的节点加载数据,以使它们发布在列表框中。 这是我的 xml 文件的样子。

<?xml version="1.0" encoding="utf-8"?>
<MovieData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Movie>
    <Name>Death Race</Name>
    <Type>Action</Type>
    <Type>Adventure</Type>
    <Rating>R</Rating>
    <Disk>Blu-Ray</Disk>
  </Movie>
  <Movie>
    <Name>Death Race 2</Name>
    <Type>Action</Type>
    <Type>Adventure</Type>
    <Rating>R</Rating>
    <Disk>Blu-Ray</Disk>
  </Movie>
</MovieData>

这就是我想要做的。

try
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(movieListXML);
        XmlNodeList nodeList = doc.SelectNodes("/MovieData[@*]");
        foreach (XmlNode xn in nodeList)
        {
            XmlNode movie = xn.SelectSingleNode("Movie");
            if (movie != null)
            {
                movieTypeListBox.Items.Add(movie["Name"].InnerText);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

更新的代码仍有问题。它只显示一个电影名称,而不是所有电影名称。

try
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(movieListXML);
        XmlNodeList nodeList = doc.SelectNodes("/MovieData");
        foreach (XmlNode xn in nodeList)
        {
            XmlNode movie = xn.SelectSingleNode("Movie");
            if (movie != null)
            {
                movieTypeListBox.Items.Add(movie["Name"].InnerText);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

谁能告诉我问题出在哪里?

另一个问题:谁能告诉我如何按电影名称的字母顺序组织数据?

【问题讨论】:

  • doc.loadXML 方法中出现错误(代码的哪一行)?
  • 我怀疑问题在于它正在尝试读取此数据: 但由于它有 ?在开始时。我的建议是改用 DataGrid,然后根据需要从中获取数据:)
  • 顺便问一下,movieListXML 是在哪里定义的?
  • 一开始就定义了。在初始化方法中。它是xml文件的路径。这是正确的,因为它可以让我添加内容并且不会引发错误。
  • Data at the root level is invalid 的可能副本。当你应该使用Load时,你正在使用LoadXml

标签: xml c#-4.0 xmldocument


【解决方案1】:

检查您的 xml 文件 - 其中可能有一个 Bite order 标记。在十六进制编辑器中打开文件并从文件开头删除非打印字符。

由于您的 xml 看起来不错 - 特别是 xml 声明 - 我很确定这将是您的问题。

取决于创建文件时使用的字符编码,它会类似于:0xFEFF(如果是 utf-8 - 认为是小端序)

以下是获取所有电影名称的方法:

           XmlNodeList nodeList = doc.SelectNodes("/MovieData/Movie");
            foreach (XmlNode xn in nodeList)
            {
                    Console.WriteLine(xn["Name"].InnerText);
            }

如果你也想对它们进行排序,那么 XDocument 可能更容易。

【讨论】:

  • 我不确定你的意思我在上面的帖子中发布了整个 xml 文件。我正在使用 Visual Studio 查看文件。我该怎么做?我对此很陌生,现在只做了大约 2 天。感谢您的帮助
  • 是的,这就是我第一次遇到这个问题时的想法——文件看起来很好。但是,老实说,在十六进制编辑器中查看文件 - 我敢打赌,它的开头有 2 或 3 个不可打印的字符。
  • in vs 右键单击​​项目中的 xml 文件,然后单击 open with ...。然后选择二进制编辑器。事实上,我刚刚对我拥有的任何随机 xml 文件都这样做了——文件以 0xEFBBBF 开头——不记得那是哪个 unicode 编码。编辑 xml 文件时 - 只需添加 encoding='' 属性即可在 vs 中再次设置此值
  • 我像你说的那样通过二进制编辑器查看了它。这就是它显示的内容 EF BB BF 是我删除的内容吗?我删除了,仍然没有。
  • 是的 - 这就是您需要删除的内容。您没有在 vs 文本编辑器中重新打开文件,是吗 - 如果您这样做,它会写回 BOM。
【解决方案2】:

我的心理调试能力告诉我movieListXML 可能是一个文件名,在这种情况下你想调用

//movieListXML = @"c:\xmlFile.xml";
doc.Load(movieListXML);

而不是

//movieListXML = @"<MovieData><Movie></Movie></MovieData>";
doc.LoadXml(movieListXML);

将实际的 XML 作为字符串输入

【讨论】:

  • 我改变了建议。现在我没有收到错误,但它仍然没有将数据显示到列表框中。
  • @user2860193 将doc.SelectNodes("/MovieData[@*]"); 更改为doc.SelectNodes("/MovieData");
  • 部分有效。我更改了建议的内容,它仅在列表框中显示第一个电影名称。我希望它显示所有这些。谢谢你的帮助。希望你能帮我解决这个问题。
  • @user2860193 是的,这就是您所期望的。再次查看您的代码,您正在选择MovieData 的列表(其中只有一个),并且您只从每个列表中选择Movie 的单个实例
  • @user2860193 我认为你可以从这里弄清楚其余的,如果你不明白怎么做,那么你可以提出另一个问题
猜你喜欢
  • 2013-10-14
  • 2010-12-02
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多