В моем комментарии я имел в виду, что вы делаете в коде (вложенные циклы) то, что может сделать для вас правильный XPath. Использование LINQ-to-XML может сделать это еще проще для написания. Но теперь, когда мы видим, как вы хотите отформатировать ваш XML-файл, мы можем предложить свои собственные ответы. Я бы написал ParseHtml()
метод так:
public void ParseHtml()
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlCode);
var cells = htmlDoc.DocumentNode
// use the right XPath rather than looping manually
.SelectNodes(@"//tr/tr/td[@class='statBox']")
.Select(node => node.InnerText.Trim())
.ToList();
var elementNames = new[] { "Name", "Team", "Pos", "GP", "G", "A", "PlusMinus", "PIM", "PP", "SH", "GW", "OT", "Shots", "ShotPctg", "TOIPerGame", "ShiftsPerGame", "FOWinPctg", "UnknownField" };
var xmlDoc =
new XElement("Stats", new XAttribute("Date", DateTime.Now.ToShortDateString()),
new XElement("Player", new XAttribute("Rank", cells.First()),
// generate the elements based on the parsed cells
cells.Skip(1)
.Zip(elementNames, (Value, Name) => new XElement(Name, Value))
.Where(element => !String.IsNullOrEmpty(element.Value))
)
);
// save to your file
xmlDoc.Save(filepath);
}
Производит вывод:
<?xml version="1.0" encoding="utf-8"?>
<Stats Date="1/3/2011">
<Player Rank="1">
<Name>Sidney Crosby</Name>
<Team>PIT</Team>
<Pos>C</Pos>
<GP>39</GP>
<G>32</G>
<A>33</A>
<PlusMinus>20</PlusMinus>
<PIM>29</PIM>
<PP>10</PP>
<SH>1</SH>
<GW>3</GW>
<Shots>0</Shots>
<ShotPctg>154</ShotPctg>
<TOIPerGame>20.8</TOIPerGame>
<ShiftsPerGame>21:54</ShiftsPerGame>
<FOWinPctg>22.6</FOWinPctg>
<UnknownField>55.7</UnknownField>
</Player>
</Stats>