第一:这不是Reading Child Nodes with XMLReader的副本 (不是同一种语言,无法帮助我)。
我对XMLreading很新,我试图达到特定元素的子元素,但我很难达到它,这是一个例子:
XML元素:
update.php
我试图从特定的“Group”元素到达“Client”元素,这是我的C#代码:
<Group ExerciseNumber="0" Name="R33-IOS1_IOS1" ExerciseName="Unallocated" Status="offline" StatusStatistics="0/1">
<Clients>
<Client ClientName="R33-IOS1_IOS1" MachineName="R33-IOS1" ClientType="HC0" ClientStatus="Disconnected" />
</Clients>
<GroupAppendedData GroupID="201" Type="IOS" DomeType="None" ConnectedTo="" ForceType="Enemy" />
</Group>
注意: 重要的是客户端元素读取将处于相同的循环迭代中(如果可能,如果不是,我将不得不考虑我的生成类的另一个设计)。
*编辑XML不是一种选择。
谢谢。
答案 0 :(得分:2)
LINQ to XML比XmlReader更容易使用,这将为您提供文档中所有客户端的计算机名称:
var machineNames = XElement.Parse("data.xml")
.Descendants("Client")
.Select(client => client.Attribute("MachineName").Value);
编辑 - 这会在每次迭代中返回两个名称:
var query = XElement.Load("data.xml")
.Descendants("Client")
.Select(client => new {
MachineName = client.Attribute("MachineName").Value,
GroupName = client.Ancestors("Group").Select(g => g.Attribute("Name").Value).First()
});
foreach (var x in query)
Console.WriteLine($"GroupName: {x.GroupName}, MachineName: {x.MachineName}");
答案 1 :(得分:1)
根据建议,除非您有充分的理由使用XmlReader
,否则首选使用更高级别的API(如LINQ to XML)。
以下是使用查询语法的解决方案:
var clients = from @group in doc.Descendants("Group")
let groupName = (string) @group.Attribute("Name")
from client in @group.Descendants("Client")
select new
{
GroupName = groupName,
ClientName = (string) client.Attribute("ClientName"),
MachineName = (string) client.Attribute("MachineName"),
};
有关工作示例,请参阅this fiddle。
答案 2 :(得分:1)
尝试xml linq中的ReadFrom()方法
while (reader.Read())
{
if (reader.Name.Equals("Group"))
{
XElement group = (XElement)XDocument.ReadFrom(reader);
}
}
reader.Close();