无法从 XML 文件加载内部节点

Cannot load internal nodes from XML file

我有一个 xml 形式的模式

<?xml version="1.0" encoding="UTF-8"?>
<project ref="edward" name="Edward(A)">
<desc/>
<Zones>
   <Zone ref="1" name="Zone1"/>
   <Zone ref="2" name="Zone2"/>
   <Zone ref="3" name="Zone3"/>
   <Zone ref="4" name="Zone4"/>
</Zones>
</project>

我正在尝试使用 Xml 提取所有区域值到 Linq(不是专家)

我试过了

 string xmlString = System.IO.File.ReadAllText("..\..\..\v1.xml");

 XDocument xdoc = new XDocument();
 xdoc=XDocument.Parse(xmlString);

 var ele = xdoc.Descendants("Zones")
               .Select(x => (string)x.Element("name"))
               .FirstOrDefault();
 // this is null



var result = xdoc.Element("project").Descendants("Zones").Descendants("Zone");
foreach (var item in result)
{
      Console.WriteLine(item.name); //what should be here
}

请检查您的 xml 文件路径。我认为,问题在这里。

 string xmlString = System.IO.File.ReadAllText(dicorrectPath);

您可以将项目添加到列表中,或者使用 Dictionary<int, string> 可能类似于...

Dictionary<int, string> Zones = new Dictionary<int, string>();
foreach (var item in result) {
  int.TryParse(item.Attribute("ref").Value, out int value);
  Zones.Add(value, item.Attribute("name").Value);
  Console.WriteLine(item.Attribute("name").Value);
  Console.WriteLine(item.Attribute("ref").Value);
}

另一种方法使用两个简单的Classes…

仔细观察,我打赌使用几个 classes 和 System.Xml.Serialization; 库可能会使这更容易。给定 XML 文件。一个 Class 看起来很明显……称为具有 intstring 属性的 Zone 对象。然后另一个 Class 我们可以调用 ZoneProject.

ZoneProject Class 将具有三 (3) 个属性。在这种情况下,两个 string 属性称为 RefNameList<Zone>Zone 对象称为 Zones. 这两个 [= =69=]es 可能看起来像……

ZoneClass

public class Zone {
  [XmlAttribute("ref")]
  public int Ref { get; set; }
  
  [XmlAttribute("name")]
  public string Name { get; set; }
}

ZoneProject Class

[XmlRoot("project")]
public class ZoneProject {
  [XmlAttribute("ref")]
  public string Ref { get; set; }
  
  [XmlAttribute("name")]
  public string Name { get; set; }
  
  [XmlArray("Zones")]
  public List<Zone> Zones { get; set; }
}

为了帮助“反序列化”XML,我们添加了额外的限定符,以帮助将 XML element/attributes 与每个 class 的特定 属性 配对。 XmlRoot 是带有 XmlAttributes 的基础 class ZoneProject 和使用 XmlArray 限定符的 Zone 对象的集合。此 属性 将是一个 List<Zone> 集合。 Zone Class.

也是如此

通过此设置,我们可以使用 System.Xml.Serialization; 库并将 XML 文件反序列化为单个 ZoneProject 对象。像……

string filePath = @"PathToYourXML_File\file.xml";
XmlSerializer serializer = new XmlSerializer(typeof(ZoneProject));
ZoneProject TheZoneProject;
using (FileStream fs = File.OpenRead(filePath)) {
  TheZoneProject = (ZoneProject)serializer.Deserialize(fs);
}

需要注意的是,@Enyra on the SO question How to read XML file into List<>?的回答……对上面的回答很有帮助。

我希望这是有道理的。

您可以使用 Linq 收集区域属性:

var result = xdoc.Element("project").Descendants("Zones").Descendants("Zone");
var zonesAtributes = result.Select(x => 
    new 
    { 
        name = x.Attribute("name").Value, 
        @ref = x.Attribute("ref").Value 
    }).ToArray();