无法从 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 看起来很明显……称为具有 int
和 string
属性的 Zone
对象。然后另一个 Class 我们可以调用 ZoneProject
.
ZoneProject
Class 将具有三 (3) 个属性。在这种情况下,两个 string
属性称为 Ref
和 Name
,List<Zone>
个 Zone
对象称为 Zones.
这两个 [= =69=]es 可能看起来像……
Zone
Class
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();
我有一个 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 看起来很明显……称为具有 int
和 string
属性的 Zone
对象。然后另一个 Class 我们可以调用 ZoneProject
.
ZoneProject
Class 将具有三 (3) 个属性。在这种情况下,两个 string
属性称为 Ref
和 Name
,List<Zone>
个 Zone
对象称为 Zones.
这两个 [= =69=]es 可能看起来像……
Zone
Class
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();