有一个XML文件,里面有orders节点,orders节点下面有 多个 order节点。每个order节点下面有很多节点其中billToInfo、shipments、discounts节点有子节点其他节点没有子节点。需求:
如:一个oders里面有多个order先把当前order没有子节点的数据取出来先插入数据库,然后在取出billToInfo节点(包括下级子节点)值插入数据库,接着是shipments节点(包括下级子节点)值插入数据库,最后是discounts节点(包括下级子节点)值插入数据库。下面是XML文件<etlive xmlns="http://etlive.com/integration/xmlbean">
  <results>
    <info>
      <timeStamp>Fri Mar 02 10:03:03 PST 2012</timeStamp>
      <site>jessicasimpson</site>
      <environment>production</environment>
      <vmType/>
      <host/>
      <vmId>jessicasimpson-prod-iws1</vmId>
      <systemLocale>en</systemLocale>
      <driver>oracle.jdbc.driver.OracleDataSource</driver>
      <dbUrl>jdbc:oracle:thin:@10.100.3.60:1523:SAPRD7G1</dbUrl>
    </info>
    <result>
      <output>
        <orders>
          <order pk="107101">
            <code>ML_107101</code>
            <dateCreated>2012-03-02T09:37:13.889-08:00</dateCreated>
            <dateModified>2012-03-02T09:37:13.924-08:00</dateModified>
            <siteCode>jessicasimpson</siteCode>
            <locale>en_US</locale>
            <customerCode>ML_180988</customerCode>
            <status>Ordered</status>
            <subTotal>88.20</subTotal>
            <taxTotal>0.00</taxTotal>
            <shippingTotal>22.00</shippingTotal>
            <shippingCostTotal>7.00</shippingCostTotal>
            <shippingMethodTotal>15.00</shippingMethodTotal>
            <shippingWeightTotal>0.00</shippingWeightTotal>
            <shippingLocationTotal>0.00</shippingLocationTotal>
            <giftWrapTotal>0.00</giftWrapTotal>
            <additionalAddressTotal>0.00</additionalAddressTotal>
            <additionalChargesTotal>0.00</additionalChargesTotal>
            <weightSurchargeTotal>0.00</weightSurchargeTotal>
            <total>110.20</total>
            <merchandiseTotal>98.00</merchandiseTotal>
            <deferred>false</deferred>
            <multipleAddresses>false</multipleAddresses>
            <sourceCodesAsString>WELCOME10*|*</sourceCodesAsString>
            <deleted>false</deleted>
            <dateOrdered>2012-03-02T09:37:13.888-08:00</dateOrdered>
            <billToInfo pk="107502">
              <code>ML_107502</code>
              <dateCreated>2012-03-02T09:37:13.888-08:00</dateCreated>
              <dateModified>2012-03-02T09:37:13.888-08:00</dateModified>
              <attributePages>
                <attributePage>
                  <name>person</name>
                  <attributes>
                    <firstName>Brandi</firstName>
                    <lastName>Pharr</lastName>
                  </attributes>
                </attributePage>
                <attributePage>
                  <name>address</name>
                  <attributes>
                    <street1>293 Marion Place</street1>
                    <postOfficeBox>false</postOfficeBox>
                    <city>Merritt Island</city>
                    <state>FL</state>
                    <country>US</country>
                    <postalCode>32953</postalCode>
                  </attributes>
                </attributePage>
              </attributePages>
              <phone1>3214463699</phone1>
              <email>[email protected]</email>
            </billToInfo>
            <shipments>
              <orderShipment pk="107101">
                <code>ML_107101</code>
                <dateCreated>2012-03-02T09:37:13.842-08:00</dateCreated>
                <shipToInfo pk="107501">
                  <code>ML_107501</code>
                  <dateCreated>2012-03-02T09:37:13.796-08:00</dateCreated>
                  <dateModified>2012-03-02T09:37:13.796-08:00</dateModified>
                  <attributePages>
                    <attributePage>
                      <name>person</name>
                      <attributes>
                        <firstName>Brandi</firstName>
                        <lastName>Pharr</lastName>
                      </attributes>
                    </attributePage>
                    <attributePage>
                      <name>address</name>
                      <attributes>
                        <street1>293 Marion Place</street1>
                        <postOfficeBox>false</postOfficeBox>
                        <city>Merritt Island</city>
                        <state>FL</state>
                        <country>US</country>
                        <postalCode>32953</postalCode>
                      </attributes>
                    </attributePage>
                  </attributePages>
                  <phone1>3214463699</phone1>
                  <email>[email protected]</email>
                </shipToInfo>
                <status>Ordered</status>
                <shippingMethodCode>UPS1DY</shippingMethodCode>
                <shippingMethodName>UPS Next Day</shippingMethodName>
                <shippingMethodDescription>All orders placed by 10AM PST will arrive Next Business Day.</shippingMethodDescription>
                <subTotal>98.00</subTotal>
                <total>120.00</total>
                <shippingTotal>22.00</shippingTotal>
                <shippingCostTotal>7.00</shippingCostTotal>
                <shippingMethodTotal>15.00</shippingMethodTotal>
                <shippingWeightTotal>0.00</shippingWeightTotal>
                <taxTotal>0.00</taxTotal>
                <giftWrapTotal>0.00</giftWrapTotal>
                <additionalChargesTotal>0.00</additionalChargesTotal>
                <weightSurchargeTotal>0.00</weightSurchargeTotal>
                <merchandiseTotal>98.00</merchandiseTotal>
                <deleted>false</deleted>
                <items>
                  <orderItem pk="107201">
                    <code>ML_107201</code>
                    <dateCreated>2012-03-02T09:37:13.842-08:00</dateCreated>
                    <categoryCode>C2-Sub Category 1</categoryCode>
                    <productCode>CATHI</productCode>
                    <productName>CATHI</productName>
                    <status>Ordered</status>
                    <regularPrice>98.00</regularPrice>
                    <sellPrice>98.00</sellPrice>
                    <subTotal>98.00</subTotal>
                    <qty>1</qty>
                    <ordinal>0</ordinal>
                    <sku>CATHIJV2811800</sku>
                    <skuPk>107437</skuPk>
                    <overWeight>false</overWeight>
                    <giftCertificate>false</giftCertificate>
                    <options>6,NATURAL COMBO</options>
                    <optionNames>6,Natural Combo</optionNames>
                    <freeGift>false</freeGift>
                    <kitPart>false</kitPart>
                  </orderItem>
                </items>
              </orderShipment>
            </shipments>
            <discounts>
              <discount>
                <message>10% Off Discount has been applied</message>
                <amount>9.80</amount>
                <pricingName>10% OFF</pricingName>
                <sourceCodesAsString>WELCOME10*|*</sourceCodesAsString>
              </discount>
            </discounts>
          </order>
           </orders>      </output>
      <summary>
        <total>3</total>
        <failed>0</failed>
      </summary>
    </result>
  </results>
</etlive>
上面的XML文件只有一个order,由于CSDN正文只能输入10000个字符 XML文件里面我把后面的order删掉了。完整的xml文件我的博客文件里:http://blog.csdn.net/junjie94bei/article/details/7470517

解决方案 »

  1.   

    XMLDocuemnt, 不是有SelectNodes方法么? 配合XPath很容易定位到节点至于简单的读操作和写库就不用说了吧?
      

  2.   

    [xml] view plaincopy 1. 最常见的XML数据类型有:Element, Attribute,Comment, Text.  
    2.   
    3.    Element, 指形如<Name>Tom<Name>的节点。它可以包括:Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference.  
    4.   
    5.    Attribute, 指在<Employee >中的粗体部分。  
    6.   
    7.    Comment,指形如:<!-- my comment --> 的节点。  
    8.   
    9.    Text,指在<Name>Tom<Name>的粗体部分。  
    10.   
    11.   在XML中,可以用XmlNode对象来参照各种XML数据类型。  
    12.   
    13.    2.1 查询已知绝对路径的节点(集)  
    14.   
    15.    objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee”)  
    16.   
    17.   或者  
    18.   
    19.    objNodeList = objNode.SelectNodes(“/Company/Department/Employees/Employee”)  
    20.   
    21.   以上两种方法可返回一个NodeList对象,如果要返回单个节点可使用SelectSingleNode方法,该方法如果查询到一个或多个节点,返回第一个节点;如果没有查询的任何节点返回 Nothing。例如:  
    22.   
    23.    objNode = objNode.SelectSingleNode(“/Company/Department/Employees/Employee”)  
    24.   
    25.    If Not (objNode is Nothing) then  
    26.   
    27.    ‘- Do process  
    28.   
    29.    End If  
    30.   
    31.    2.2 查询已知相对路径的节点(集)  
    32.   
    33.   可使用类似于文件路径的相对路径的方式来查询XML的数据  
    34.   
    35.    objNode = objDoc.SelectSingleNode(“Company/Department”)  
    36.   
    37.    objNodeList = objNode.SelectNodes(“../Department)  
    38.   
    39.    objNode = objNode.SelectNode(“Employees/Employee”)  
    40.   
    41.    2.3 查询已知元素名的节点(集)  
    42.   
    43.   在使用不规则的层次文档时,由于不知道中间层次的元素名,可使用//符号来越过中间的节点,查询其子,孙或多层次下的其他所有元素。例如:  
    44.   
    45.    objNodeList = objDoc.SelectNodes(“Company//Employee”)  
    46.   
    47.    2.4 查询属性(attribute)节点  
    48.   
    49.   以上的各种方法都返回元素(element)节点(集),返回属性(attribute),只需要采用相应的方法,在属性名前加一个@符号即可,例如:  
    50.   
    51.    objNodeList = objDoc.SelectNodes(“Company/Department/Employees/Employee/@id”)  
    52.   
    53.    objNodeList = objDoc.SelectNodes(“Company//@id”)  
    54.   
    55.    2.5 查询Text节点  
    56.   
    57.   使用text()来获取Text节点。  
    58.   
    59.    objNode = objDoc.SelectSingleNode(“Company/Department/Deparmt_Name/text()”)  
    60.   
    61.    2.6 查询特定条件的节点  
    62.   
    63.   使用[]符号来查询特定条件的节点。例如:  
    64.   
    65.    a. 返回id号为 10102的Employee节点  
    66.   
    67.    objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee[@id=’10102’]”)  
    68.   
    69.    b. 返回Name为Zhang Qi的Name 节点  
    70.   
    71.    objNode = objDoc.SelectSingleNode(“Company/Department/Employees/Employee/Name[text()=’Zhang Qi’]”)  
    72.   
    73.    c. 返回部门含有职员22345的部门名称节点  
    74.   
    75.    objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name")  
    76.   
    77.    2.7 查询多重模式的节点  
    78.   
    79.   使用 | 符号可以获得多重模式的节点。例如:  
    80.   
    81.    objNodeList = objDoc.SelectNodes(“Company/Department/Department_Name | Company/Department/Manager”)  
    82.   
    83.    2.8 查询任意子节点  
    84.   
    85.   使用*符号可以返回当前节点的所有子节点。  
    86.   
    87.    objNodeList = objDoc.SelectNodes(“Company/*/Manager)  
    88.   
    89.   或者  
    90.   
    91.    objNodeList = objNode.ChildNodes  
    92.   
    93.     
    94.   
    95.    3 XML数据的编辑  
    96.   
    97.    3.1 增加一个元素的属性(attribute)节点  
    98.   
    99.    Dim objNodeAttr As XmlNode  
    100.   
    101.    objNodeAttr = objDoc.CreateAttribute("id", Nothing)  
    102.   
    103.    objNodeAttr.InnerXml = "101"  
    104.   
    105.    objNode.Attributes.Append(objNodeAttr)  
    106.   
    107.    3.2 删除一个元素的属性  
    108.   
    109.    objNode.Attributes.Remove(objNodeAttr)  
    110.   
    111.    3.3 增加一个子元素(Element)  
    112.   
    113.    Dim objNodeChild As XmlNode  
    114.   
    115.    objNodeChild = objDoc.CreateElement(Nothing, "ID", Nothing)  
    116.   
    117.    objNodeChild.InnerXml = "101"  
    118.   
    119.    objNode.AppendChild(objNodeChild)  
    120.   
    121.    3.4 删除一个子元素  
    122.   
    123.    objNode.RemoveChild(objNodeChild)  
    124.   
    125.    3.5 替换一个子元素  
    126.   
    127.    objNOde.ReplaceChild(newChild,oldChild)  
    128.   
    129.     
    130.   
    131.    4 参考数据  
    132.   
    133.    <?xml version="1.0" encoding="UTF-8"?>  
    134.   
    135.    <Company>  
    136.   
    137.    <Department >  
    138.   
    139.    <Department_Name>Cai WuBu</Department_Name>  
    140.   
    141.    <Manager>Zhang Bin</Manager>  
    142.   
    143.    <Employees>  
    144.   
    145.    <Employee >  
    146.   
    147.    <Employee_ID>12345</Employee_ID>  
    148.   
    149.    <Name>Zhang Bin</Name>  
    150.   
    151.    <Gender>male</Gender>  
    152.   
    153.    </Employee>  
    154.   
    155.    <Employee >  
    156.   
    157.    <Employee_ID>10101</Employee_ID>  
    158.   
    159.    <Name>Zhang QI</Name>  
    160.   
    161.    <Gender>female</Gender>  
    162.   
    163.    </Employee>  
    164.   
    165.    <Employee >  
    166.   
    167.    <Employee_ID>10102</Employee_ID>  
    168.   
    169.    <Name>Zhang Xia</Name>  
    170.   
    171.    <Gender>male</Gender>  
    172.   
    173.    </Employee>  
    174.   
    175.    <Employee >  
    176.   
    177.    <Employee_ID>10201</Employee_ID>  
    178.   
    179.    <Name>ZhangChuang</Name>  
    180.   
    181.    <Gender>male</Gender>  
    182.   
    183.    </Employee>  
    184.   
    185.    <Employee >  
    186.   
    187.    <Employee_ID>10202</Employee_ID>  
    188.   
    189.    <Name>Zhang Jun</Name>  
    190.   
    191.    <Gender>male</Gender>  
    192.   
    193.    </Employee>  
    194.   
    195.    </Employees>  
    196.   
    197.    </Department>  
    198.   
    199.    <Department >  
    200.   
    201.    <Department_Name>KaiFa Bu</Department_Name>  
    202.   
    203.    <Manager>Wang Bin</Manager>  
    204.   
    205.    <Employees>  
    206.   
    207.    <Employee >  
    208.   
    209.    <Employee_ID>22345</Employee_ID>  
    210.   
    211.    <Name>Wang Bin</Name>  
    212.   
    213.    <Gender>male</Gender>  
    214.   
    215.    </Employee>  
    216.   
    217.    <Employee >  
    218.   
    219.    <Employee_ID>20101</Employee_ID>  
    220.   
    221.    <Name>Wang QI</Name>  
    222.   
    223.    <Gender>female</Gender>  
    224.   
    225.    </Employee>  
    226.   
    227.    <Employee >  
    228.   
    229.    <Employee_ID>20102</Employee_ID>  
    230.   
    231.    <Name>Wang Xia</Name>  
    232.   
    233.    <Gender>male</Gender>  
    234.   
    235.    </Employee>  
    236.   
    237.    <Employee >  
    238.   
    239.    <Employee_ID>20201</Employee_ID>  
    240.   
    241.    <Name>Wang Chuang</Name>  
    242.   
    243.    <Gender>male</Gender>  
    244.   
    245.    </Employee>  
    246.   
    247.    <Employee >  
    248.   
    249.    <Employee_ID>20201</Employee_ID>  
    250.   
    251.    <Name>Wang Jun</Name>  
    252.   
    253.    <Gender>male</Gender>  
    254.   
    255.    </Employee>  
    256.   
    257.    </Employees>  
    258.   
    259.    </Department>  
    260.   
    261.    </Company>  
      

  3.   

    http://blog.csdn.net/wf520pb/article/details/2644549
      

  4.   

    我自己写的代码是取得了 orders下全部的数据。但不知道怎么分别拆开 每个order 和每个order的billToInfo、shipments、discounts 节点using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.IO;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                XmlDocument xmlDoc = new XmlDocument();//实例化XmlDocument
                string xmlFile = HelperClass.GetFiles(new DirectoryInfo(System.IO.Directory.GetCurrentDirectory()), "*.xml");
                xmlDoc.Load(xmlFile);//加载xml文档            XmlNamespaceManager xns = new XmlNamespaceManager(xmlDoc.NameTable);
                xns.AddNamespace("a", "http://etlive.com/integration/xmlbean");
                XmlNode node = xmlDoc.SelectSingleNode("//a:orders", xns);
                ResponseText(node.ChildNodes);
                Console.ReadLine();
            }
            protected static void ResponseText(XmlNodeList node)
            {
                foreach (XmlNode n in node)
                {
                    if (n.HasChildNodes)
                    {
                        ResponseText(n.ChildNodes);
                    }
                    else
                    {
                        Console.WriteLine(n.InnerText);
                    }
                }
            }    }
    }
      

  5.   


            static void Main(string[] args)
            {
                List<XmlNode> list = new List<XmlNode>();
                XmlDocument xml = new XmlDocument();
                xml.Load(@"E:\a.xml");
                XmlNamespaceManager xns = new XmlNamespaceManager(xml.NameTable);
                xns.AddNamespace("a", "http://etlive.com/integration/xmlbean");
                XmlNodeList node = xml.SelectNodes("//a:orders/a:order", xns);
                foreach (XmlNode n in node)
                {
                    ResponseText(n.ChildNodes, list);
                }
                Console.WriteLine(new string('*', 20));
                foreach (XmlNode n in list)
                {
                    Console.WriteLine("{0}的所有子节点值", n.Name);
                    ResponseText(n.ChildNodes);
                    Console.WriteLine(new string('*', 20));
                }
                Console.ReadLine();
            }
            protected static void ResponseText(XmlNodeList node, List<XmlNode> list)
            {
                foreach (XmlNode n in node)
                {
                    if (n.HasChildNodes && n.FirstChild.NodeType != XmlNodeType.Text)
                    {
                        list.Add(n);
                    }
                    else
                        Console.WriteLine(n.InnerText);
                }
            }
            protected static void ResponseText(XmlNodeList node)
            {
                foreach (XmlNode n in node)
                {
                    if (n.HasChildNodes && n.FirstChild.NodeType != XmlNodeType.Text)
                        ResponseText(n.ChildNodes);
                    else
                        Console.WriteLine(n.InnerText);
                }
            }
    /*
    ML_107101
    2012-03-02T09:37:13.889-08:00
    2012-03-02T09:37:13.924-08:00
    jessicasimpson
    en_US
    ML_180988
    Ordered
    88.20
    0.00
    22.00
    7.00
    15.00
    0.00
    0.00
    0.00
    0.00
    0.00
    0.00
    110.20
    98.00
    false
    false
    WELCOME10*|*
    false
    2012-03-02T09:37:13.888-08:00
    ********************
    billToInfo的所有子节点值
    ML_107502
    2012-03-02T09:37:13.888-08:00
    2012-03-02T09:37:13.888-08:00
    person
    Brandi
    Pharr
    address
    293 Marion Place
    false
    Merritt Island
    FL
    US
    32953
    3214463699
    [email protected]
    ********************
    shipments的所有子节点值
    ML_107101
    2012-03-02T09:37:13.842-08:00
    ML_107501
    2012-03-02T09:37:13.796-08:00
    2012-03-02T09:37:13.796-08:00
    person
    Brandi
    Pharr
    address
    293 Marion Place
    false
    Merritt Island
    FL
    US
    32953
    3214463699
    [email protected]
    Ordered
    UPS1DY
    UPS Next Day
    All orders placed by 10AM PST will arrive Next Business Day.
    98.00
    120.00
    22.00
    7.00
    15.00
    0.00
    0.00
    0.00
    0.00
    0.00
    98.00
    false
    ML_107201
    2012-03-02T09:37:13.842-08:00
    C2-Sub Category 1
    CATHI
    CATHI
    Ordered
    98.00
    98.00
    98.00
    1
    0
    CATHIJV2811800
    107437
    false
    false
    6,NATURAL COMBO
    6,Natural Combo
    false
    false
    ********************
    discounts的所有子节点值
    10% Off Discount has been applied
    9.80
    10% OFF
    WELCOME10*|*
    ********************
    */
      

  6.   

    huangwenquan123 老大请问一下如果XML里面有多个order呢? 按着您的操作取值的时候是一次把所有的order值都取出来了
    能否变成 这种模式 比如说   
    第一个order 然后是第一个order下billToInfo、shipments、discounts值
    第二个order 然后是第一个order下billToInfo、shipments、discounts值
    ..........
    .........
    .....
    依此类推
      

  7.   

    Main方法改成这样.        static void Main(string[] args)
            {
                List<XmlNode> list = new List<XmlNode>();
                XmlDocument xml = new XmlDocument();
                xml.Load(@"E:\a.xml");
                XmlNamespaceManager xns = new XmlNamespaceManager(xml.NameTable);
                xns.AddNamespace("a", "http://etlive.com/integration/xmlbean");
                XmlNodeList node = xml.SelectNodes("//a:orders/a:order", xns);
                foreach (XmlNode n in node)
                {
                    ResponseText(n.ChildNodes, list);
                    Console.WriteLine(new string('*', 20));
                    foreach (XmlNode nn in list)
                    {
                        Console.WriteLine("{0}的所有子节点值", nn.Name);
                        ResponseText(nn.ChildNodes);
                        Console.WriteLine(new string('*', 20));
                        list = new List<XmlNode>();
                    }
                }
                Console.ReadLine();
            }
      

  8.   

    如果把shipments下面的 items 节点也取出来呢?
     比如说   
    第一个order 然后是第一个order下billToInfo、shipments、items、discounts值