使用C#重命名XML文件中的子节点?

时间:2013-07-06 11:27:17

标签: c# xml

我在使用c#重命名xml文件中的子节点时遇到问题。

这是我的xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ZACAC01>
  <IDOC BEGIN="1">
    <ZACGPIAD SEGMENT="1">
      <IDENTIFIER>D000</IDENTIFIER>
      <CUST_DEL_NO/>
      <CUST_DEL_DATE/>
      <TRUCKNO/>
      <DRIVERNAME/>
      <DRIVERID/>
      <RESPONS_OFF/>
      <CONFIRM_DATE>20/01/13</CONFIRM_DATE>
      <SERIAL_NO>2</SERIAL_NO>
      <SERIAL_CHAR/>
      <DEL_INFO1/>
      <QTY>0</QTY>
      <DEL_INFO2/>
      <QTY>0</QTY>
      <DEL_INFO3/>
      <QTY>0</QTY>
      <TRANS_COMPANY>0</TRANS_COMPANY>
    </ZACGPIAD>
  </IDOC>
</ZACAC01>

以下是我的要求:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ZACAC01>
  <IDOC BEGIN="1">
    <ZACGPIADD SEGMENT="1">
      <IDENTIFIER>D000</IDENTIFIER>
      <CUST_DEL_NO/>
      <CUST_DEL_DATE/>
      <TRUCKNO/>
      <DRIVERNAME/>
      <DRIVERID/>
      <RESPONS_OFF/>
      <CONFIRM_DATE>20/01/13</CONFIRM_DATE>
      <SERIAL_NO>2</SERIAL_NO>
      <SERIAL_CHAR/>
      <DEL_INFO1/>
      <QTY1>0</QTY1>
      <DEL_INFO2/>
      <QTY2>0</QTY2>
      <DEL_INFO3/>
      <QTY3>0</QTY3>
      <TRANS_COMPANY>0</TRANS_COMPANY>
    </ZACGPIADD>
  </IDOC>
</ZACAC01>

我可以使用以下代码将段代码<ZACGPIAD>更改为此<ZACGPIADD>

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(srcfile);
var root = xmlDoc.GetElementsByTagName("IDOC")[0];
var oldElem = root.SelectSingleNode("ZACGPIAD");
var newElem = xmlDoc.CreateElement("ZACGPIADD");
root.ReplaceChild(newElem, oldElem);

while (oldElem.ChildNodes.Count != 0)
{
    newElem.AppendChild(oldElem.ChildNodes[0]);
}
while (oldElem.Attributes.Count != 0)
{
    newElem.Attributes.Append(oldElem.Attributes[0]);
}
xmlDoc.Save(desfile);

但我无法将<QTY>代码更改为<QTY1><QTY2><QTY3>

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我认为你的代码中有正确的答案。您可以使用SelectSingleNode来提取第一个<QTY>元素:

var qtyNode = root.SelectSingleNode("ZACAC01/IDOC/ZACGPIADD/QTY[1]") 

然后在其父节点上使用ReplaceChild。然后对第二个和第三个<QTY>节点执行相同操作,分别将“1”替换为“2”和“3”。

答案 1 :(得分:0)

您可以使用XDocument并对XElements进行操作,从而为节点名称公开setter(因此您只需设置新名称而不是进行节点替换):

var doc = XDocument.Load(srcfile);
var zacgpidNode = doc.Descendants("ZACGPIAD").First();
zacgpidNode.Name = "ZACGPIADD";
// now rename all QTY nodes
var qtyNodes = zacgpidNode.Elements("QTY").ToArray();
for (int i = 0; i < qtyNodes.Length; i++)
{
    qtyNodes[i].Name = string.Format("{0}{1}", qtyNodes[i].Name, i+1);
}

doc.Save(desfile);

如果您的文档结构与示例中显示的不同,则Descendants("ZACGPIAD").First()可能不合适。您可以使用XPathSelectElement方法更好地控制要提取的内容:

var node = doc.XPathSelectElement("//IDOC[@BEGIN='1']/ZACGPIAD[@SEGMENT='1']");