我需要迭代一些具有不寻常格式的XML。它看起来像这样:
<Baseball>
<Player playerID="123" playerName="John Smith" playerBats="Right"/>
<position positionID="1b" positionCode="abc" counter="3"/>
<position positionID="2b" positionCode="def" counter="2"/>
</Player>
</Baseball>
我无法更改提供给我的格式。我需要遍历每一行,不同的部分被拉到不同的地方。我将在C#中执行代码。想法?谢谢!
答案 0 :(得分:2)
假设您的输入XML实际上是有效的XML,这就是我用于此类事情的模式。
您的示例XML无效,因为Player
是自关闭的,并且具有明确的结束标记。我把它调整到最好的猜测应该是什么样的。
如果这确实是您必须处理的XML,XmlDocument.LoadXml
将抛出错误。您需要找到一些其他方法来处理格式错误的数据,可能会预处理数据以移除/
元素上的Player
,因此它不再自动关闭。
基本模式是XML中的每个元素都有一个类。每个类都有一个静态函数FromXml
,它接受XML中匹配元素的XmlElement
。 FromXML
负责从属性中读取,解析和填充其属性。通过在相关类上调用FromXml
来处理子元素。
class Program
{
static void Main(string[] args)
{
string xml =
@"<Baseball>
<Player playerID=""123"" playerName=""John Smith"" playerBats=""Right"">
<position positionID=""1b"" positionCode=""abc"" counter=""3""/>
<position positionID=""2b"" positionCode=""def"" counter=""2""/>
</Player>
</Baseball>";
var document = new XmlDocument();
document.LoadXml(xml);
var players = new List<Player>();
foreach (XmlElement baseballElement in document.SelectNodes("Baseball"))
{
foreach (XmlElement playerElement in baseballElement.SelectNodes("Player"))
{
players.Add(Player.FromXml(playerElement));
}
}
Console.ReadLine();
}
}
public class Player
{
public static Player FromXml(XmlElement PlayerElement)
{
var player = new Player();
player.PlayerId = int.Parse(PlayerElement.GetAttribute("playerID"));
player.PlayerName = PlayerElement.GetAttribute("playerName");
player.PlayerBats = PlayerElement.GetAttribute("playerBats");
foreach (XmlElement positionElement in PlayerElement.SelectNodes("position"))
{
player.Positions.Add(Position.FromXml(positionElement));
}
return player;
}
public int PlayerId { get; set; }
public string PlayerName { get; set; }
public string PlayerBats { get; set; }
private List<Position> _positions = new List<Position>();
public List<Position> Positions
{
get { return _positions; }
}
}
public class Position
{
public static Position FromXml(XmlElement positionElement)
{
var position = new Position();
position.PositionId = positionElement.GetAttribute("positionID");
position.PositionCode = positionElement.GetAttribute("positionCode");
position.Counter = int.Parse(positionElement.GetAttribute("counter"));
return position;
}
public string PositionId { get; set; }
public string PositionCode { get; set; }
public int Counter { get; set; }
}
这将创建一个Player
列表,其中每个列表都包含Position
列表,所有列表都是从XML填充的。
我还没有对输入XML进行任何类型的错误检查。如果缺少任何属性或格式错误,则会引发错误。