1

我在使用 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>

我怎样才能做到这一点?

4

2 回答 2

0

您可以使用XDocument和操作XElements哪个暴露设置器作为节点名称(因此您可以简单地设置新名称而不是进行节点替换):

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']");
于 2013-07-06T11:55:19.373 回答
0

我认为您的代码中有正确的答案。您可以使用SelectSingleNode以下方法拉出第一个<QTY>元素:

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

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

于 2013-07-06T11:38:34.247 回答