如何更新位于 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");
我有一个 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");