我必须遍历的异常 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 中匹配元素的 XmlElementFromXML 负责从属性中读取、解析和填充其属性。子元素通过在其关联的 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。如果缺少任何属性或格式错误,则会引发错误。