如何更新位于 xml 文件深处的多个级别的元素

How to update an element located multiple level deep inside an xml file

我有一个 xml 文件结构如下:

<root>
      <DataFields>
        <DataField Id="FORM_HTML" IsArray="FALSE">
          <DataType>
            <DeclaredType Id="File">
            </DeclaredType>
          </DataType>
          <InitialValue>N/A</InitialValue>
          <Description>Form</Description>
          <ExtendedAttributes>
            <ExtendedAttribute Name="FormatString" Value="">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatCulture" Value="">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatPrecision" Value="0">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatTimeZone" Value="0">
            </ExtendedAttribute>
            <ExtendedAttribute Name="Visible" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispSearch" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispList" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispHome" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="ReadOnly" Value="Y">
            </ExtendedAttribute>
            <ExtendedAttribute Name="File">
               <File>"What I want" </File>
            </ExtendedAttribute>
          </ExtendedAttributes>
        </DataField>
       ....
       </DataFields>

</root>

以上只是一个示例,DataField 标签多次重复使用不同的 id,但具有相同的标签和名称。

我在下面试过了。它获取具有我想要的 ID 的数据字段,但不是仅替换 File 标签的内容,而是替换 'ExtendedAttributes' 标签之间的所有内容。

var getHTMLFORM = from data in xmlFile.Descendants(nameSpace + "DataField")
                       let customcheck = data.Attribute("Id").Value
                       where customcheck == "FORM_HTML" && customcheck != null
                        select data;
foreach (var i in getHTMLFORM)
 {
    i.Element(nameSpace + "ExtendedAttributes").Value = encodedstring;
 }

这是可以理解的,这并没有达到我想要的效果,因为它获取了 'ExtendedAttributes' 标签的值并替换了它。尽管 i.Element(nameSpace + "ExtendedAttributes").Value 只对 file 标签中的值执行 return。我只是不知道如何更新 'File' 标记中的值,并且仍然仅限于 FORM_HTML 数据字段。

该代码的结果是:

<root>
      <DataFields>
        <DataField Id="FORM_HTML" IsArray="FALSE">
          <DataType>
            <DeclaredType Id="File">
            </DeclaredType>
          </DataType>
          <InitialValue>N/A</InitialValue>
          <Description>Form</Description>
          <ExtendedAttributes>
                "inserted"
          </ExtendedAttributes>
        </DataField>
       ....
       </DataFields>

</root>

我想要的是:

<root>
      <DataFields>
        <DataField Id="FORM_HTML" IsArray="FALSE">
          <DataType>
            <DeclaredType Id="File">
            </DeclaredType>
          </DataType>
          <InitialValue>N/A</InitialValue>
          <Description>Form</Description>
          <ExtendedAttributes>
            <ExtendedAttribute Name="FormatString" Value="">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatCulture" Value="">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatPrecision" Value="0">
            </ExtendedAttribute>
            <ExtendedAttribute Name="FormatTimeZone" Value="0">
            </ExtendedAttribute>
            <ExtendedAttribute Name="Visible" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispSearch" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispList" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="DispHome" Value="N">
            </ExtendedAttribute>
            <ExtendedAttribute Name="ReadOnly" Value="Y">
            </ExtendedAttribute>
            <ExtendedAttribute Name="File">
               <File>"Inserted" </File>
            </ExtendedAttribute>
          </ExtendedAttributes>
        </DataField>
       ....
       </DataFields>

</root>

问题: 我将如何替换 'File' 标签中的元素?

您只需更改 File 元素的值而不是 ExtendedAttributes 元素。

将 foreach 循环内的代码更改为以下代码,它将更新 ExtendedAttributes 元素中所有文件元素的值:

i.Element(nameSpace + "ExtendedAttributes").Descendants(nameSpace + "File").ToList().ForEach(file => file.Value = "value for File");