使用重复的子节点更新XML

问题描述 投票:1回答:2

我有如下XML:

  <?xml version="1.0" encoding="utf-8"?>
  <Report ReportType="Time_Data">
  <Parameters>
   <Parameter>
        <Name>P_400Meter</Name>
        <Caption>400 Meter race:</Caption>
        <Categories>
            <Category>Race</Category>
        </Categories>
        <Values>
            <Value>3</Value>
            <Value>2</Value>
            <Value>3</Value>
            <Value>4</Value>
        </Values>
        <Color />
        <Range> <= 3</Range>
        </Status>
    </Parameter>
    </Parameters>
  </Report>

我已使用以下代码更新了上述xml;

foreach (XmlNode xn in xnl) 
{
  tmpStrData = "";
  CatStr = "";
  foreach (XmlNode xn_node in xn.ChildNodes)
  {
   if (xn_node.Name == "Categories")
    {
     foreach (XmlNode xn_CatNode in xn_node.ChildNodes) 
      {
       CatStr = xn_CatNode.InnerText;
      }
     }
    else if (xn_node.Name == "Values")
     {
      foreach (XmlNode xn_ValNode in xn_node.ChildNodes)
       {
        tmpStrData = tmpStrData + "<" + xn_ValNode.Name + ">" + xn_node.InnerText.Replace("<", "&lt;").Replace(">","&gt;") + "</" + xn_ValNode.Name + ">";
       }
     }
    else
     {
      tmpStrData = tmpStrData + "<" + xn_node.Name + ">" + xn_node.InnerText + "</" +
      xn_node.Name + ">";
     }            
}
MainParameters = MainParameters + "<" + CatStr + ">" + tmpStrData + "</" + CatStr + ">";  }           

现在更新的xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
  <Report ReportType="Time_Data">
  <Parameters>
 <Race>
  <Name>P_400Meter</Name>
  <Caption>400 Meter race:</Caption>
  <Value>3</Value>
  <Value>2</Value>
  <Value>3</Value>
  <Value>4</Value>
 </Race>
 </Parameters></Report>

现在,我需要以不需要在所有行中都相同的值节点的方式来编辑xml,我希望它像这样;

  <Value1>3</Value1>
  <Value2>2</Value2>
  <Value3>3</Value3>
  <Value4>4</Value4>

我陷入了困境。请帮助我。

c# xml xmldocument
2个回答
0
投票

@@ Sreeja,代码可能仍不是最佳优化的,下面的代码达到了上述目的,如下:

    var doc = XDocument.Load(xml); //load your updated xml 
    int number = 1;
    foreach (var element in doc.Descendants())
    {
        if (element.Name.LocalName.StartsWith("Value"))
        {
            element.Name = element.Name+""+ number;
            number++; //increment by one
        }
    }

让我知道这是否适合您。


0
投票

我尝试过,对我有用。

byte ValID = 0;
foreach (XmlNode xn_ValNode in xn_node.ChildNodes)//get the main Value 
{
  if (ValID==0)
 tmpStrData = tmpStrData + "<" + xn_ValNode.Name + ">" + tmpValueData + "</" + xn_ValNode.Name + ">";
  else
 tmpStrData = tmpStrData + "<" + xn_ValNode.Name + ValID.ToString() +  ">" + tmpValueData + "</" + xn_ValNode.Name + ValID.ToString() + ">";
  ValID++;
}
© www.soinside.com 2019 - 2024. All rights reserved.