我必须遍历的异常 XML 格式
Unusual XML Format I Must Iterate Through
我需要遍历某些 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# 中编写代码。想法?谢谢!
假设您的输入 XML 实际上是有效的 XML,这是我用于此类事情的模式。
您的示例 XML 无效,因为 Player
既是自关闭的,又具有明确的关闭标记。我已将其调整为我对它应该是什么样子的最佳猜测。
如果那确实是您必须处理的 XML,XmlDocument.LoadXml
将抛出错误。您将需要找到一些其他方法来处理格式错误的数据,也许预处理数据以删除 Player
元素上的 /
以便它不再自动关闭。
基本模式是 XML 中的每个元素都有一个 class。每个 class 都有一个静态函数 FromXml
,它接受 XML 中匹配元素的 XmlElement
。 FromXML
负责从属性中读取、解析和填充其属性。子元素通过在其关联的 class 上调用 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。如果缺少任何属性或格式错误,则会引发错误。
我需要遍历某些 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# 中编写代码。想法?谢谢!
假设您的输入 XML 实际上是有效的 XML,这是我用于此类事情的模式。
您的示例 XML 无效,因为 Player
既是自关闭的,又具有明确的关闭标记。我已将其调整为我对它应该是什么样子的最佳猜测。
如果那确实是您必须处理的 XML,XmlDocument.LoadXml
将抛出错误。您将需要找到一些其他方法来处理格式错误的数据,也许预处理数据以删除 Player
元素上的 /
以便它不再自动关闭。
基本模式是 XML 中的每个元素都有一个 class。每个 class 都有一个静态函数 FromXml
,它接受 XML 中匹配元素的 XmlElement
。 FromXML
负责从属性中读取、解析和填充其属性。子元素通过在其关联的 class 上调用 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。如果缺少任何属性或格式错误,则会引发错误。