xml 如何循环增加同名节点

月光下的土豆 2014-11-03 08:56:29

<Loop>
<Po>
<BillNo>12346</BillNo>
<Qty>12346</Qty>
<Po>
<LOOP_PID_g006>
<PID>
<e01_0349>F</e01_0349>
<e03_0559>ZZ</e03_0559>
<e04_0751>OD</e04_0751>
<e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
</PID>
</LOOP_PID_g006>
</Loop>
<Loop>
<Po>
<BillNo>123467</BillNo>
<Qty>12346</Qty>
<Po>
<LOOP_PID_g006>
<PID>
<e01_0349>F</e01_0349>
<e03_0559>ZZ</e03_0559>
<e04_0751>OD</e04_0751>
<e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
</PID>
</LOOP_PID_g006>
</Loop>

如何循环增加Loop节点,请大家给个思路,谢谢
...全文
508 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
月光下的土豆 2014-11-04
  • 打赏
  • 举报
回复
谢谢大家,最后通过增加属性来实,再把属性删除
月光下的土豆 2014-11-03
  • 打赏
  • 举报
回复

string xpathLOOP_PO1_g005 = "//xsi:Body/xsi:X12855/xsi:LOOP_PO1_g005";
                        string xpathPO1 = "//xsi:Body/xsi:X12855/xsi:LOOP_PO1_g005/xsi:PO1";
                        for (int kk = 0; kk < 4; kk++)
                        {
                            AddParentNode(xml, "LOOP_PO1_g005", xmlNameSpace, xX12855);
                            XmlNode xLoopPo = xml.SelectSingleNode(xpathLOOP_PO1_g005, xnm);
                            string[] pO1TArray = { "e01_0354" };
                            AddChileNode(xml, "PO1", xmlNameSpace, xLoopPo, xpathPO1, xnm, pO1TArray);
                        }
这是我的代码 升成的是这样的

<LOOP_PO1_g005>-<PO1><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354></PO1>
<PO1/>
<PO1/>
<PO1/>
</LOOP_PO1_g005>
<LOOP_PO1_g005/>
<LOOP_PO1_g005/>
<LOOP_PO1_g005/>
我想问题应该出在 XmlNode xLoopPo = xml.SelectSingleNode(xpathLOOP_PO1_g005, xnm); 这里,但不知道怎么去处理 下面是两个方法

private void AddChileNode(XmlDocument xml, string nodeName, string xmlNameSpace,
            XmlNode xmlNode, string xPath, XmlNamespaceManager xnm,string[] nodeChileName)
        {
            AddParentNode(xml,nodeName,xmlNameSpace,xmlNode);
            XmlNode xChile = xml.SelectSingleNode(xPath, xnm);
            XmlElement xEmt = null;
            foreach (string node in nodeChileName)
            {
                xEmt = xml.CreateElement("", node, xmlNameSpace);
                xEmt.InnerText = node;
                xChile.AppendChild(xEmt);
            }
        }
        private void AddParentNode(XmlDocument xml,string nodeName, string xmlNameSpace,XmlNode xmlNode)
        {
            XmlElement xmlElement = xml.CreateElement("", nodeName, xmlNameSpace);
            xmlNode.AppendChild(xmlElement);
        }
月光下的土豆 2014-11-03
  • 打赏
  • 举报
回复
引用 7 楼 duanzi_peng 的回复:
模板你不会创建??第一个生成节点,保存。第二次循环的时候 判断是否存在节点,存在就直接拿过来用。这有什么问题么?

 XElement carElement = new XElement("Car",
                             new XAttribute("Id", entity.Id),
                             new XAttribute("Width", entity.Width),
                             new XAttribute("Height", entity.Height),
                             new XAttribute("IsSelected", entity.IsSelected.ToString()),
                             new XAttribute("CollectionName", entity.CollectionName),
                             new XAttribute("GroupName", entity.GroupName),
                             new XElement("Name", entity.Name),
                             new XElement("IP", entity.IP),
                             new XElement("X", entity.X),
                             new XElement("Y", entity.Y)
                        );
this.xmlDoc.Add(carElement);
咱俩不在一个高度,我入门级,有些东西看看不懂。我还停留在2.0时代
exception92 2014-11-03
  • 打赏
  • 举报
回复
模板你不会创建??第一个生成节点,保存。第二次循环的时候 判断是否存在节点,存在就直接拿过来用。这有什么问题么?

 XElement carElement = new XElement("Car",
                             new XAttribute("Id", entity.Id),
                             new XAttribute("Width", entity.Width),
                             new XAttribute("Height", entity.Height),
                             new XAttribute("IsSelected", entity.IsSelected.ToString()),
                             new XAttribute("CollectionName", entity.CollectionName),
                             new XAttribute("GroupName", entity.GroupName),
                             new XElement("Name", entity.Name),
                             new XElement("IP", entity.IP),
                             new XElement("X", entity.X),
                             new XElement("Y", entity.Y)
                        );
this.xmlDoc.Add(carElement);
月光下的土豆 2014-11-03
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:
[quote=引用 4 楼 Mpt_hi 的回复:] [quote=引用 2 楼 duanzi_peng 的回复:] xml:

<?xml version="1.0" encoding="utf-8"?>
<Loops>
  <Loop>
    <Po>
      <BillNo>12346</BillNo>
      <Qty>12346</Qty>
    </Po>
    <LOOP_PID_g006>
      <PID>
        <e01_0349>F</e01_0349>
        <e03_0559>ZZ</e03_0559>
        <e04_0751>OD</e04_0751>
        <e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
      </PID>
    </LOOP_PID_g006>
  </Loop>
</Loops>
引用using System.Xml.Linq; 代码:

 string path7 = @"D:\20141103.xml";
            XElement root = XElement.Load(path7);
            var loop = root.Elements("Loop").FirstOrDefault();
            root.Add(loop);
            root.Save(path7);
每个节点的值是从数据库里取来的,也就是说节点的值是动态的[/quote] 你问题描述清楚了么? 自己手动拼接节点。 http://blog.csdn.net/duanzi_peng/article/details/24018431[/quote] 按着你的方式,得有一个模版文件。如果没有模版,直接生成,应该如何处理,谢谢!
exception92 2014-11-03
  • 打赏
  • 举报
回复
引用 4 楼 Mpt_hi 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:] xml:

<?xml version="1.0" encoding="utf-8"?>
<Loops>
  <Loop>
    <Po>
      <BillNo>12346</BillNo>
      <Qty>12346</Qty>
    </Po>
    <LOOP_PID_g006>
      <PID>
        <e01_0349>F</e01_0349>
        <e03_0559>ZZ</e03_0559>
        <e04_0751>OD</e04_0751>
        <e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
      </PID>
    </LOOP_PID_g006>
  </Loop>
</Loops>
引用using System.Xml.Linq; 代码:

 string path7 = @"D:\20141103.xml";
            XElement root = XElement.Load(path7);
            var loop = root.Elements("Loop").FirstOrDefault();
            root.Add(loop);
            root.Save(path7);
每个节点的值是从数据库里取来的,也就是说节点的值是动态的[/quote] 你问题描述清楚了么? 自己手动拼接节点。 http://blog.csdn.net/duanzi_peng/article/details/24018431
月光下的土豆 2014-11-03
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:
xml:

<?xml version="1.0" encoding="utf-8"?>
<Loops>
  <Loop>
    <Po>
      <BillNo>12346</BillNo>
      <Qty>12346</Qty>
    </Po>
    <LOOP_PID_g006>
      <PID>
        <e01_0349>F</e01_0349>
        <e03_0559>ZZ</e03_0559>
        <e04_0751>OD</e04_0751>
        <e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
      </PID>
    </LOOP_PID_g006>
  </Loop>
</Loops>
引用using System.Xml.Linq; 代码:

 string path7 = @"D:\20141103.xml";
            XElement root = XElement.Load(path7);
            var loop = root.Elements("Loop").FirstOrDefault();
            root.Add(loop);
            root.Save(path7);
每个节点的值是从数据库里取来的,也就是说节点的值是动态的
月光下的土豆 2014-11-03
  • 打赏
  • 举报
回复
m3(一款老外的ERP)系统里引出的是这种格式的文件,我要根据m3系统支持的格式生成。然后通过m3引入
exception92 2014-11-03
  • 打赏
  • 举报
回复
xml:

<?xml version="1.0" encoding="utf-8"?>
<Loops>
  <Loop>
    <Po>
      <BillNo>12346</BillNo>
      <Qty>12346</Qty>
    </Po>
    <LOOP_PID_g006>
      <PID>
        <e01_0349>F</e01_0349>
        <e03_0559>ZZ</e03_0559>
        <e04_0751>OD</e04_0751>
        <e05_0352>12 GSK 77 FS-FDA-A</e05_0352>
      </PID>
    </LOOP_PID_g006>
  </Loop>
</Loops>
引用using System.Xml.Linq; 代码:

 string path7 = @"D:\20141103.xml";
            XElement root = XElement.Load(path7);
            var loop = root.Elements("Loop").FirstOrDefault();
            root.Add(loop);
            root.Save(path7);
於黾 2014-11-03
  • 打赏
  • 举报
回复
为什么要这样 这样你读取出来之后,还能区分出谁是谁?
我现在在路上 2014-11-03
  • 打赏
  • 举报
回复
 XElement carElement = new XElement("Car",
                             new XAttribute("Id", entity.Id),
                             new XAttribute("Width", entity.Width),
                             new XAttribute("Height", entity.Height),
                             new XAttribute("IsSelected", entity.IsSelected.ToString()),
                             new XAttribute("CollectionName", entity.CollectionName),
                             new XAttribute("GroupName", entity.GroupName),
                             new XElement("Name", entity.Name),
                             new XElement("IP", entity.IP),
                             new XElement("X", entity.X),
                             new XElement("Y", entity.Y)
                        );
this.xmlDoc.Add(carElement);
他这个是Linq to xml,很方便的对XML进行增删改查。 new XAttribute("Id", entity.Id):是对这个节点增加个属性为Id的 new XElement("IP", entity.IP),:是对这个节点增加个子节点为IP的 注意,如果entity.Id,entity.IP为null或“”,请为他赋值,不然为造成<IP/>..
引用 9 楼 Mpt_hi 的回复:

string xpathLOOP_PO1_g005 = "//xsi:Body/xsi:X12855/xsi:LOOP_PO1_g005";
                        string xpathPO1 = "//xsi:Body/xsi:X12855/xsi:LOOP_PO1_g005/xsi:PO1";
                        for (int kk = 0; kk < 4; kk++)
                        {
                            AddParentNode(xml, "LOOP_PO1_g005", xmlNameSpace, xX12855);
                            XmlNode xLoopPo = xml.SelectSingleNode(xpathLOOP_PO1_g005, xnm);
                            string[] pO1TArray = { "e01_0354" };
                            AddChileNode(xml, "PO1", xmlNameSpace, xLoopPo, xpathPO1, xnm, pO1TArray);
                        }
这是我的代码 升成的是这样的

<LOOP_PO1_g005>-<PO1><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354><e01_0354>e01_0354</e01_0354></PO1>
<PO1/>
<PO1/>
<PO1/>
</LOOP_PO1_g005>
<LOOP_PO1_g005/>
<LOOP_PO1_g005/>
<LOOP_PO1_g005/>
我想问题应该出在 XmlNode xLoopPo = xml.SelectSingleNode(xpathLOOP_PO1_g005, xnm); 这里,但不知道怎么去处理 下面是两个方法

private void AddChileNode(XmlDocument xml, string nodeName, string xmlNameSpace,
            XmlNode xmlNode, string xPath, XmlNamespaceManager xnm,string[] nodeChileName)
        {
            AddParentNode(xml,nodeName,xmlNameSpace,xmlNode);
            XmlNode xChile = xml.SelectSingleNode(xPath, xnm);
            XmlElement xEmt = null;
            foreach (string node in nodeChileName)
            {
                xEmt = xml.CreateElement("", node, xmlNameSpace);
                xEmt.InnerText = node;
                xChile.AppendChild(xEmt);
            }
        }
        private void AddParentNode(XmlDocument xml,string nodeName, string xmlNameSpace,XmlNode xmlNode)
        {
            XmlElement xmlElement = xml.CreateElement("", nodeName, xmlNameSpace);
            xmlNode.AppendChild(xmlElement);
        }

110,534

社区成员

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

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

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