0

我正在尝试读取一些 XML 数据,但遇到了一个我以前从未发现过的错误。任何人都可以对此有所了解吗?

错误:

网名:System.Xml.Linq.Extensions+c__Iterator5

UnityEngine.Debug:Log(Object) HV_ReadSettingsFile:Update()(在 Assets/_scripts/HV_ReadSettingsFile.cs:64)

这是我在 XML 中读取的代码,最终生成了错误:

   var xdoc = XDocument.Load(@"C:\\Test.xml");
        var screen = xdoc.Descendants("Screen");
              

        foreach (var Screen in screen)
        {
            HV_Screen _screen = new HV_Screen();
            _screen.Name = Convert.ToString(Screen.Descendants("Name").Attributes("Name"));
              

            Debug.Log("Screen name: " + _screen.Name);
        }

还有我的 XML 表:

<Settings>
  <Display_Settings>
    <Screen>
      <Name Name="Screen" />
      <ScreenTag Tag="Screen Tag" />
      <LocalPosition X="12" Y="81" Z="28" />
      <Width Width="54" />
      <Height Height="912" />
    </Screen>
     <Screen>
      <Name Name="Screen" />
      <ScreenTag Tag="Screen Tag" />
      <LocalPosition X="32" Y="21" Z="28" />
      <Width Width="54" />
      <Height Height="912" />
    </Screen>
  </Display_Settings>
</Settings>
4

2 回答 2

1

那不是错误。这正是您所要求的记录。您已经询问了所有元素中的所有Name属性Name......但随后您尝试将该序列记录为单个值。

我想你想要:

var screens = xdoc.Descendants("Screen");
foreach (var screen in screens)
{
    HV_Screen _screen = new HV_Screen();
    _screen.Name = (string) screen.Element("Name").Attribute("Name");

    Debug.Log("Screen name: " + _screen.Name);
}

这现在正在寻找一个元素和每个元素的一个属性Screen。请注意,我已经更改了变量名称以遵循正常的 .NET 约定,除了_screen我不知道它是什么HV_Screen意思。

目前还不清楚为什么你有单独的元素Width,HeightName, 每个元素都有一个与元素名称匹配的属性 - 并且ScreenTag几乎这样做了。如果 XML 在您的控制之下,您可以考虑:

<Screen Name="Screen" Width="54" Height="912" Tag="Screen Tag">
  <LocalPosition X="12" Y="81" Z="28" />
</Screen>

也许:

<Screen>
  <Name>Screen</Name>
  <ScreenTag>Screen Tag</ScreenTag>
  <LocalPosition X="12" Y="81" Z="28" />
  <Width>54</Width>
  <Height>912</Height>
</Screen>

此外,如果您正在尝试构建HV_Screen项目集合,您可能希望使用查询而不是foreach循环 - 但目前尚不清楚除了记录调试信息之外您实际上要做什么。

于 2013-06-03T15:24:41.540 回答
0

你可以尝试这样做:

var xdoc = XDocument.Load(@"C:\\test.xml");

        List<string> lstScreen = xdoc.Descendants("Screen").Select(x => x.Element("Name").Attribute("Name").Value).ToList();

        foreach (string name in lstScreen)
        {
          ...

希望能帮到你!!

于 2013-06-03T15:49:11.757 回答