我必须通过不寻常的XML格式

时间:2017-05-05 02:18:14

标签: c# xml c#-5.0

我需要迭代一些具有不寻常格式的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#中执行代码。想法?谢谢!

1 个答案:

答案 0 :(得分:2)

假设您的输入XML实际上是有效的XML,这就是我用于此类事情的模式。

您的示例XML无效,因为Player是自关闭的,并且具有明确的结束标记。我把它调整到最好的猜测应该是什么样的。

如果这确实是您必须处理的XML,XmlDocument.LoadXml将抛出错误。您需要找到一些其他方法来处理格式错误的数据,可能会预处理数据以移除/元素上的Player,因此它不再自动关闭。

基本模式是XML中的每个元素都有一个类。每个类都有一个静态函数FromXml,它接受​​XML中匹配元素的XmlElementFromXML负责从属性中读取,解析和填充其属性。通过在相关类上调用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进行任何类型的错误检查。如果缺少任何属性或格式错误,则会引发错误。