求助关于XML操作的问题走过路过不要错过!谢谢帮助啊!

空白画映 2012-04-17 05:41:17
有一个XML文件,里面有orders节点,orders节点下面有 多个 order节点。每个order节点下面有很多节点其中billToInfo、shipments、discounts节点有子节点其他节点没有子节点。

需求:
如:一个oders里面有多个order先把当前order没有子节点的数据取出来先插入数据库,然后在取出billToInfo节点(包括下级子节点)值插入数据库,接着是shipments节点(包括下级子节点)值插入数据库,最后是discounts节点(包括下级子节点)值插入数据库。

下面是XML文件

<marketlive xmlns="http://marketlive.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>bpharr21@yahoo.com</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>bpharr21@yahoo.com</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>
</marketlive>


上面的XML文件只有一个order,由于CSDN正文只能输入10000个字符 XML文件里面我把后面的order删掉了。

完整的xml文件我的博客文件里:http://blog.csdn.net/junjie94bei/article/details/7470517
...全文
200 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
空白画映 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
Main方法改成这样.

C# code


static void Main(string[] args)
{
List<XmlNode> list = new List<XmlNode>();
XmlDocument xml = new XmlDocument();
xml……
[/Quote]
如果把shipments下面的 items 节点也取出来呢?
比如说
第一个order 然后是第一个order下billToInfo、shipments、items、discounts值
空白画映 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
C# code


static void Main(string[] args)
{
List<XmlNode> list = new List<XmlNode>();
XmlDocument xml = new XmlDocument();
xml.Load(@"E:\a.xm……
[/Quote]


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

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://marketlive.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
bpharr21@yahoo.com
********************
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
bpharr21@yahoo.com
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*|*
********************
*/
空白画映 2012-04-18
  • 打赏
  • 举报
回复
我自己写的代码是取得了 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://marketlive.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);
}
}
}

}
}

空白画映 2012-04-18
  • 打赏
  • 举报
回复
继续顶起!
huangwenquan123 2012-04-18
  • 打赏
  • 举报
回复
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://marketlive.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();
}
色拉油 2012-04-17
  • 打赏
  • 举报
回复
[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>
honkerhero 2012-04-17
  • 打赏
  • 举报
回复
XMLDocuemnt, 不是有SelectNodes方法么? 配合XPath很容易定位到节点

至于简单的读操作和写库就不用说了吧?

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧