首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过XML节点读取XML文件

通过XML节点读取XML文件
EN

Stack Overflow用户
提问于 2012-11-07 19:53:09
回答 2查看 2.4K关注 0票数 0

我有一个试图读入并插入到数据库中的XML文档。只有一个GamePlay节点,但是GamePlayStep可能会重复,所以我为此创建了一个节点列表。由于某些原因,GamePlayStep无法接收数据。下面是XML文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<GameData>
  <GamePlay>
    <type>add</type>
    <GamePlayID>1</GamePlayID>
    <ParticipantID>1</ParticipantID>
    <GameID>1</GameID>
    <GameDifficultyID>1</GameDifficultyID>
    <Start>2012-08-06T12:19:33.154Z</Start>
    <End>2012-08-06T12:30:33.154Z</End>
    <Success>False</Success>
  </GamePlay>
  <GamePlayStep>
    <GamePlayStepID>1</GamePlayStepID>
    <Start>2012-08-06T12:19:33.154Z</Start>
    <End>2012-08-06T12:30:33.154Z</End>
    <SortOrder>1</SortOrder>
    <Score>1</Score>
    <hintUsed>True</hintUsed>
    <GamePause>
      <GamePauseID>1</GamePauseID>
      <Start>2012-08-06T12:19:33.154Z</Start>
      <End>2012-08-06T12:30:33.154Z</End>
      <Order>1</Order>
      <Duration>05:01</Duration>
    </GamePause>
  </GamePlayStep>
</GameData>

下面是我的代码:

代码语言:javascript
复制
public static void start()
        {
            string[] filePaths = Directory.GetFiles(System.Configuration.ConfigurationManager.ConnectionStrings["filePath"].ConnectionString);
            List<GamePlay> gameObj = new List<GamePlay>();
            List<GamePlayStep> gameStepObj = new List<GamePlayStep>();
            foreach (string value in filePaths)
            {
                XmlDocument xd = new XmlDocument();
                XmlNodeList GameSteps;
                xd.Load(value);
                XmlNode documentNode = xd.SelectSingleNode("/GameData/GamePlay");
                GameSteps = xd.SelectNodes("/GameData/GamePlay/GamePlayStep");

                GamePlay newGamePlay = new GamePlay();
                newGamePlay.setType(Convert.ToString(documentNode.SelectSingleNode("type").InnerText));
                newGamePlay.setGamePlayID(Convert.ToInt32(documentNode.SelectSingleNode("GamePlayID").InnerText));
                newGamePlay.setParticipantID(Convert.ToInt32(documentNode.SelectSingleNode("ParticipantID").InnerText));
                newGamePlay.setGameDifficultyID(Convert.ToInt32(documentNode.SelectSingleNode("GameDifficultyID").InnerText));
                newGamePlay.setGameID(Convert.ToInt32(documentNode.SelectSingleNode("GameID").InnerText));
                newGamePlay.setStartDateTime(Convert.ToDateTime(documentNode.SelectSingleNode("Start").InnerText));
                newGamePlay.setEndDateTime(Convert.ToDateTime(documentNode.SelectSingleNode("End").InnerText));
                newGamePlay.setSuccess(Convert.ToBoolean(documentNode.SelectSingleNode("Success").InnerText));
                newGamePlay.setFile(value);
                newGamePlay.addNewGamePlay();

                foreach (XmlNode documentNode2 in GameSteps)
                {

                    GamePlayStep newGamePlayStep = new GamePlayStep();
                    newGamePlayStep.setGamePlayStepID(Convert.ToInt32(documentNode2.SelectSingleNode("GamePlayStepID").InnerText));
                    newGamePlayStep.setGamePlayID(newGamePlay.getGamePlayID());
                    newGamePlayStep.setStartDateTime(Convert.ToDateTime(documentNode2.SelectSingleNode("Start").InnerText));
                    newGamePlayStep.setEndDateTime(Convert.ToDateTime(documentNode2.SelectSingleNode("End").InnerText));
                    newGamePlayStep.setOrderPlayed(Convert.ToInt32(documentNode2.SelectSingleNode("SortOrder").InnerText));
                    newGamePlayStep.setScore(Convert.ToInt32(documentNode2.SelectSingleNode("Score").InnerText));
                    newGamePlayStep.setHintUsed(Convert.ToBoolean(documentNode2.SelectSingleNode("hintUsed").InnerText));
                    newGamePlayStep.addNewGamePlayStep();


                }

            }
        }

GamePlay正确地填充了变量并将其插入到数据库中,但是NodeList中的GamePlaySteps并非如此。有没有人看到这个问题,或者我可以如何改进这个问题?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-07 20:01:23

您访问GamePlayStep的XPath不正确;

它应该是:

代码语言:javascript
复制
GameSteps = xd.SelectNodes("/GameData/GamePlayStep");

因为在文档中,GamePlayStep是GameData的子级,而不是GamePlay的子级。

票数 2
EN

Stack Overflow用户

发布于 2012-11-07 20:19:47

使用LINQ2XML....its simple和cool

代码语言:javascript
复制
XElement doc=XElement.Load("yourXml");
newGamePlay.setType(doc.Descendants("GameData").Element("GamePlay").Element("type").Value);
....
foreach (Element eml in doc.Descendants("GameData").Elements("GamePlayStep"))
{
GamePlayStep newGamePlayStep = new GamePlayStep();
newGamePlayStep.setGamePlayStepID(Convert.ToInt32(elm.Element("GamePlayStepID").Value));
newGamePlayStep.setStartDateTime(Convert.ToDateTime(elm.Element("Start").Value));
.....
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13269221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档