【问题标题】:Updating XML with repeated child nodes使用重复的子节点更新 XML
【发布时间】:2020-01-31 09:00:39
【问题描述】:

我有一个 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


    【解决方案1】:

    @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
            }
        }
    

    让我知道这是否适合你。

    【讨论】:

      【解决方案2】:

      我试过了,它对我有用。

      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++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        相关资源
        最近更新 更多