使用C#和xdocument使用另一个更新一个xml

时间:2015-11-16 14:28:32

标签: c# xml linq

我想用C#更新一个xml文件。 文档具有相同的模式,但更新文档具有新的赔率,新事件新体育。我正在使用ID来比较这两个文件,但对于锦标赛我必须按名称进行比较。有时会有更新的赔率,我需要将文件替换为更新文件中的更新文件

这是更新文件

<Sports>
    <Sport id="5" name="Tennis">
        <Tournament id="3" name="ATP - Basel, Switzerland">
            <Match id="8331220" name="Federer, Roger v Sock, Jack" startDate="2015-10-31T14:50:00">
                <MatchOdds>
                    <Bet id="20">
                        <Outcome Special="" name="1" odds="1.1"/>
                        <Outcome Special="" name="2" odds="8.25"/>
                    </Bet>
                    <Bet id="231">
                        <Outcome Special="" name="1" odds="1.22"/>
                        <Outcome Special="" name="2" odds="4.5"/>
                    </Bet>
                </MatchOdds>
            </Match>
        </Tournament>
    </Sport>
</Sports>

这是示例更新文件

<Sports>
    <Sport id="5" name="Tennis">
        <Tournament id="3" name="ATP - Basel, Switzerland">
            <Match id="8331220" name="Federer, Roger v Sock, Jack" startDate="2015-10-31T14:50:00">
                <MatchOdds>
                    <Bet id="20">
                        <Outcome Special="" name="1" odds="34"/>
                        <Outcome Special="" name="2" odds="34"/>
                    </Bet>
                    <Bet id="231">
                        <Outcome Special="" name="1" odds="34"/>
                        <Outcome Special="" name="2" odds="3434"/>
                    </Bet>
                    <Bet id="233">
                        <Outcome Special="" name="2:0" odds="1.35"/>
                        <Outcome Special="" name="2:1" odds="3.8"/>
                        <Outcome Special="" name="0:2" odds="16.25"/>
                        <Outcome Special="" name="1:2" odds="12.75"/>
                    </Bet>

                </MatchOdds>
            </Match>
            <Match id="8331268" name="Peya A / Soares B v Rojer J-J / Tecau H" startDate="2015-10-31T16:10:00">
                <MatchOdds>
                    <Bet id="20">
                        <Outcome Special="" name="1" odds="2.15"/>
                        <Outcome Special="" name="2" odds="1.75"/>
                    </Bet>

                </MatchOdds>
            </Match>
            <
    <Sport id="23" name="Volleyball">
        <Tournament id="195" name="Turkey - 1. Lig, Women">
            <Match id="8155390" name="Idmanocagi v Halkbank Ankara" startDate="2015-10-31T14:00:00">
                <MatchOdds>
                    <Bet id="226">
                        <Outcome Special="178.5" name="Over" odds="1.8"/>
                        <Outcome Special="178.5" name="Under" odds="1.95"/>
                    </Bet>
                </MatchOdds>
            </Match>

        </Tournament>
    </Sport>

</Sports>

结果xml文件必须与此类似:

<Sports>
    <Sport id="5" name="Tennis">
        <Tournament id="3" name="ATP - Basel, Switzerland">
            <Match id="8331220" name="Federer, Roger v Sock, Jack" startDate="2015-10-31T14:50:00">
                <MatchOdds>
                    <Bet id="20">
                        <Outcome Special="" name="1" odds="1.1"/>
                        <Outcome Special="" name="2" odds="8.25"/>
                    </Bet>
                    <Bet id="231">
                        <Outcome Special="" name="1" odds="34"/>
                        <Outcome Special="" name="2" odds="3434"/>
                    </Bet>
                    <Bet id="233">
                        <Outcome Special="" name="2:0" odds="1.35"/>
                        <Outcome Special="" name="2:1" odds="3.8"/>
                        <Outcome Special="" name="0:2" odds="16.25"/>
                        <Outcome Special="" name="1:2" odds="12.75"/>
                    </Bet>
                </MatchOdds>
            </Match>
            <Match id="8331268" name="Peya A / Soares B v Rojer J-J / Tecau H" startDate="2015-10-31T16:10:00">
                <MatchOdds>
                    <Bet id="20">
                        <Outcome Special="" name="1" odds="2.15"/>
                        <Outcome Special="" name="2" odds="1.75"/>
                    </Bet>

                </MatchOdds>
            </Match>
        </Tournament>
    </Sport>
    <Sport id="23" name="Volleyball">
        <Tournament id="195" name="Turkey - 1. Lig, Women">
            <Match id="8155390" name="Idmanocagi v Halkbank Ankara" startDate="2015-10-31T14:00:00">
                <MatchOdds>
                    <Bet id="226">
                        <Outcome Special="178.5" name="Over" odds="1.8"/>
                        <Outcome Special="178.5" name="Under" odds="1.95"/>
                    </Bet>
                </MatchOdds>
            </Match>

        </Tournament>
    </Sport>
</Sports>

我是C#的新手,我还在学习。所以我写这段代码: https://github.com/cologneto/123456/blob/master/LastTry/MerginXmls.cs

正如你所看到的,我无法使用LINQ,而且我使用XmlDocument和许多“for”循环来编写它。这使得我的代码不可读,有时候它的工作时间不行。这就是我放入try-catch条件的原因。 我确信它可以用更短更干净的方式制作。  有人可以帮我指导如何使用XDocument LINQ进行操作吗?

的Georgi

1 个答案:

答案 0 :(得分:0)

就像建议你应该在C#中查看XML序列化和反序列化你应该尝试类似这样的更新xml文件。

从XML Schema(XSD)文档生成一个类开始,以便轻松访问xmlfiles中的节点和元素。

使用框架工具中的XML架构定义工具xsd.exe将架构转换为可序列化的类或数据集。

运行(在vs命令提示符下)

  //Open the two xml files examples
  FileStream file1 = new FileStream(@"c:\New_Result_Tournaments.xml", FileMode.Open);
  FileStream file2 = new FileStream(@"c:\Sports_odds_databas.xml", FileMode.Open);

  // 
  XmlSerializer ser = new XmlSerializer(typeof(yourNamespace.yourClass));
  try
  {
    myNamespace.yourClass NewResult = ser.Deserialize(file1) as myNamespace.yourClass;
    yourNamespace.yourClass SportOddsDatbas = ser.Deserialize(file2) as myNamespace.yourClass;
    if( NewResult != null && SportOddsDatbas != null)
    {
      /* Here you should have access both xml files just 
         add information want update seconed file with from 
         the first.*/

      // Save the updates made in c:\Sports_odds_databas.xml
      serializer.Serialize(file2, SportOddsDatbas);
    }

  }
  catch (Exception ex)
  {
    // Todo)
    // Very good to use the exception to find fault mapping of XML can save lot of time.
  }
  file1.Close();
  file2.Close();

添加类.cs文件创建了你的项目。在项目中添加此代码已经做了一些修改,例如文件名,类和命名空间

MPI_Gatherv