//第一条XML
<?xml version="1.0" ?><OrderInfo> <OrderNum>1</OrderNum> <OrderDt></OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm>
<MedItem> <MedCd></MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>1</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem>
</OrderInfo>
//第二条XML <?xml version="1.0" ?><OrderInfo> <OrderNum>1</OrderNum> <OrderDt></OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem> <MedCd></MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>2</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>
webservice传过来的N条XML数据如何根据<OrderInfo>值来整合内部<MedItem>标签?
需要整合成这样:
<?xml version="1.0" ?><OrderInfo> <OrderNum>1</OrderNum> <OrderDt></OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem>//1 <MedCd></MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>1</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> <MedItem>//2 <MedCd></MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>2</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>
求解
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { string xml1 = @" <OrderInfo> <OrderNum>1</OrderNum> <OrderDt></OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem> <MedCd>这个是为了演示</MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>1</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>"; string xml2 = @" <OrderInfo> <OrderNum>1</OrderNum> <OrderDt></OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem> <MedCd>这是一个示例数据</MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>2</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>"; //将所有接收到的xml保存到一个 线性表中 List<string> list = new List<string>(); list.Add(xml1); list.Add(xml2); //将 xml分组,以 orderNUM(订单号)来进行分组,我们认为只要 订单号一样的 xml就是同一组数据 IEnumerable<IGrouping<string, string>> q = list.GroupBy(new Func<string, string>((item) => { XElement root = XElement.Parse(item); return root.Element("OrderNum").Value; })); //遍历分好组的 数据 foreach (var item in q) { //从线性表 中找到 订单号 是一样的 订单 var p = list.Where((gh) => { XElement root = XElement.Parse(gh); string hj = root.Element("OrderNum").Value; if (hj.Equals(item.Key)) { return true; } else { return false; } }); //将找到的数据整合到一块 XDocument xdoc = new XDocument(); XElement root1 = new XElement("OrderInfo"); xdoc.Add(root1); root1.Add(new XElement("OrderNum", "1"), new XElement("OrderDt", "1"), new XElement("OrderDtm", "1"), new XElement("MdctNum", "1"), new XElement("MdctDt", "1"), new XElement("PtntNum", "1"), new XElement("PtntNm", "1"), new XElement("Sex", "1"), new XElement("Birthday", "1")); // 自己增加需要的数据项 foreach (string 订单详情 in p) { //可以对订单详情进行数据拆解 //这里就不拆解了,直接写上 死数据,拆解方法自己去写 //还是写一个例子吧: XElement jk = XElement.Parse(订单详情); string l = jk.Element("MedItem").Element("MedCd").Value; root1.Add(new XElement("MedItem", new XElement("MedCd", l), new XElement("MedNm", "死数据"), new XElement("MedType", "死数据"), new XElement("MedUnit", "死数据"), new XElement("MedItemDose", new XElement("TakeDt", "死数据"), new XElement("TakeDays", "死数据")))); } Console.WriteLine(xdoc); } } } }
这里应该就是你想要的效果,100园豆归我啦 ,哈哈
谢谢大侠!我试试
你好,再问一下你的最后一个循环里面订单详情我该怎么写?还有就是new XElement("MedUnit", "死数据"), 我想把死数据改成它对应字段的值怎么弄
@骑着蜗牛耍流氓:
XElement jk = XElement.Parse(订单详情); string l = jk.Element("MedItem").Element("MedCd").Value;
对照着这个写
@田麦成: 嗯,原谅我不会(-。-;)
@骑着蜗牛耍流氓:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { string xml1 = @" <OrderInfo> <OrderNum>1</OrderNum> <OrderDt>2</OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem> <MedCd>这个是为了演示</MedCd> <MedNm></MedNm> <MedType></MedType> <MedUnit></MedUnit> <PowderYn></PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>1</OrderMedKey> <MedItemDose> <TakeDt></TakeDt> <TakeDays></TakeDays> <DrtsCd></DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>"; string xml2 = @" <OrderInfo> <OrderNum>1</OrderNum> <OrderDt>2</OrderDt> <OrderDtm></OrderDtm> <MdctNum></MdctNum> <MdctDt></MdctDt> <PtntNum></PtntNum> <PtntNm></PtntNm> <Sex>F</Sex> <Birthday></Birthday> <InOutClsf>I</InOutClsf> <HsptCd></HsptCd> <DptmtCd></DptmtCd> <DoctorNm></DoctorNm> <WardCd></WardCd> <RoomNum>53</RoomNum> <BedNum></BedNum> <EmgClsf>N</EmgClsf> <DschClsf>I</DschClsf> <OrderClsf> </OrderClsf> <Note></Note> <DataClsf></DataClsf> <DspsOpt></DspsOpt> <SickCd></SickCd> <SickNm></SickNm> <AllergyNm></AllergyNm> <ReqSiteCd></ReqSiteCd> <ReqSiteNm></ReqSiteNm> <MedItem> <MedCd>这是一个示例数据</MedCd> <MedNm></MedNm> <MedType>MedType</MedType> <MedUnit>MedType</MedUnit> <PowderYn>MedType</PowderYn> <UseAtcYn>Y</UseAtcYn> <GroupNum></GroupNum> <MedNote></MedNote> <DschYn></DschYn> <OrderMedKey>2</OrderMedKey> <MedItemDose> <TakeDt>MedType</TakeDt> <TakeDays>MedType</TakeDays> <DrtsCd>MedType</DrtsCd> <DrtsNm></DrtsNm> <DoseList></DoseList> </MedItemDose> </MedItem> </OrderInfo>"; //将所有接收到的xml保存到一个 线性表中 List<string> list = new List<string>(); list.Add(xml1); list.Add(xml2); //将 xml分组,以 orderNUM(订单号)来进行分组,我们认为只要 订单号一样的 xml就是同一组数据 IEnumerable<IGrouping<string, string>> q = list.GroupBy(new Func<string, string>((item) => { XElement root = XElement.Parse(item); string ak = root.Element("OrderNum").Value; return ak; })); //遍历分好组的 数据 foreach (var item in q) { //从线性表 中找到 订单号 是一样的 订单 var p = list.Where((gh) => { XElement root = XElement.Parse(gh); string hj = root.Element("OrderNum").Value; if (hj.Equals(item.Key)) { return true; } else { return false; } }); //将找到的数据整合到一块 XDocument xdoc = new XDocument(); XElement root1 = new XElement("OrderInfo"); xdoc.Add(root1); root1.Add(new XElement("OrderNum", "1"), new XElement("OrderDt", "1"), new XElement("OrderDtm", "1"), new XElement("MdctNum", "1"), new XElement("MdctDt", "1"), new XElement("PtntNum", "1"), new XElement("PtntNm", "1"), new XElement("Sex", "1"), new XElement("Birthday", "1")); // 自己增加需要的数据项 foreach (string 订单详情 in p) { //可以对订单详情进行数据拆解 //这里就不拆解了,直接写上 死数据,拆解方法自己去写 //还是写一个例子吧: XElement jk = XElement.Parse(订单详情); string MedCd = jk.Element("MedItem").Element("MedCd").Value; string MedNm = jk.Element("MedItem").Element("MedNm").Value; string MedType = jk.Element("MedItem").Element("MedType").Value; string MedUnit = jk.Element("MedItem").Element("MedUnit").Value; string PowderYn = jk.Element("MedItem").Element("PowderYn").Value; string TakeDt = jk.Element("MedItem").Element("MedItemDose").Element("TakeDt").Value; string TakeDays = jk.Element("MedItem").Element("MedItemDose").Element("TakeDays").Value; root1.Add(new XElement("MedItem", new XElement("MedCd", MedCd), new XElement("MedNm", MedNm), new XElement("MedType", MedType), new XElement("MedUnit", MedUnit), new XElement("MedItemDose", new XElement("TakeDt", TakeDt), new XElement("TakeDays", TakeDays)))); } Console.WriteLine(xdoc); } } } }
@田麦成:这次应该能看一个明白了吧
@田麦成: 看明白了,
List<string> list = new List<string>(); list.Add(xml1); list.Add(xml2);
这个地方有点疑问,因为别人XML一条一条的给我传过来 ,我该怎么加到list里面
@骑着蜗牛耍流氓:你可以将数据暂时存到数据库里。
@田麦成: 因为别人一直给我穿XML数据,有些XML的OrderNum值是一样的,有些不一样
@骑着蜗牛耍流氓:来一条,你处理一条,放数据库,来一条,你处理一条,再放数据库。
@田麦成: 這么麻烦啊, 我这边要做的其实很简单,就是他一条条传给我XML,然后我根据XML的OrderNum的值相同,然后把相同的OrderInfo下面的MedItem及内部标签全部放进一个OrderInfo里面,然后把這个XML文件保存在电脑C盘就OK了。 以上的这些操作还需要你刚才说的存到数据库吗,我感觉好复杂
@骑着蜗牛耍流氓:嗯,你的方法也可以嘛…… 正所谓条条道路通罗马
@田麦成: 嗯,谢谢
@田麦成: 大神在吗
@骑着蜗牛耍流氓:有什么问题?
@田麦成: 现在是這样的:我将你上面的变量 XML1和XML2的字符串融合在一个XML串里面,给它门套了一个外层标签<Ran>, 那上面的代码改怎么改呢
@骑着蜗牛耍流氓:不好意思刚才看到,这个简单,修改如下:
拼接整合是什么意思?找操作XML的类库呗?你这200,100的,挺土豪的啊。
就是我想把传过来的<OrderInfo>1<OrderInfo>的内部所有<MedItem>标签全部都整合在 一个 名为OrderInfo里面多个MedItem
@骑着蜗牛耍流氓: 理论上,你MedItem标签外面再包一层,作为一个MedItem数组比较好,不然直接多个MedItem这么排下来不太好,另外,你什么语言?还是找专门操作XML的库吧,你这么一个步骤让人给你一点代码并不好,你也学不到东西。。。
@顾晓北: 我用的是C#
@骑着蜗牛耍流氓: C#本身也有相关的XML操作的东西,关键是要知道XMLDocument,XMLNode,Node的property等等一些概念,怎么操作就很简单了。
https://msdn.microsoft.com/zh-cn/library/system.xml.xmldocument(v=vs.110).aspx
@顾晓北: 有没有代码示例啊
@骑着蜗牛耍流氓: 说一下大概流程吧,先用XMLDocument的load,把你的东西load到一个XML文档里,然后相关的查找node(可以用xpath),添加node,这些都是你自己的事儿了,我是真的不想给你写代码,对你没什么好处。
@顾晓北: 你上面说的这些我都知道,关键是我不知道怎么来截取和拼接,我不是专业搞开发的,只是這次工作项目需要这些
@骑着蜗牛耍流氓: 这就尴尬了。
@顾晓北: (-。-;)
Java用dom4j来解析出xml的内容,再拼接生成新的xml。
你好我用的是C#
序列化反序列化.不要去管字符串格式.你要操作的是对象.
好的,谢谢