当您只了解xml结构体的一部分时,如何读取xml并将其写回来
本文关键字:xml 读取 何读取 回来 写回 一部 了解 结构体 分时 | 更新日期: 2023-09-27 17:52:17
我有一个xml,它可能包含几种类型的节点,但我只对某些特定的节点类型感兴趣。我想更改我感兴趣的节点并保存结果,而其他节点应该保持不变。
例如,我的XML如下:<?xml version="1.0" encoding="UTF-8"?>
<Unknown>
...
<UnKnown/>
<CompanyName>
<AttrContainer>
<Attr type="String">
<Name value="'Name'" />
<Value value="'AttrContainer'" />
</Attr>
<Unknown>
...
<UnKnown/>
<SubContainer>
<AttrContainer value="'WSSMetadata'" />
<AttrContainer>
<Attr type="String">
<Name value="'Name'" />
<Value value="'AttrContainer'" />
</Attr>
<SubContainer>
<WSSMetadata value="'afe2e194-0ce7-4bfc-b446-9623e4fe7189'" />
<AttrContainer>
<Attr type="String">
<Name value="'Name'" />
<Value value="'WSSMetadata'" />
</Attr>
<Attr type="Uuid">
<Name value="'scanID'" />
<Value value="afe2e194-0ce7-4bfc-b446-9623e4fe7189" />
</Attr>
<Attr type="String">
<Name value="'imagePath'" />
</Attr>
<Attr type="String">
<Name value="'imagePathHD'" />
</Attr>
<Attr type="String">
<Name value="'imagePathThumbnail'" />
</Attr>
<Attr type="String">
<Name value="'imagePathGrey'" />
<Value value="'Images/afe2e194-0ce7-4bfc-b446-9623e4fe7189_grey.jpg'" />
</Attr>
<Attr type="String">
<Name value="'imagePathGreyHD'" />
<Value value="'Images/afe2e194-0ce7-4bfc-b446-9623e4fe7189_grey_hd.jpg'" />
</Attr>
<Attr type="String">
<Name value="'imagePathGreyThumbnail'" />
<Value value="'Images/afe2e194-0ce7-4bfc-b446-9623e4fe7189_grey_thumbnail.jpg'" />
</Attr>
</AttrContainer>
</SubContainer>
</AttrContainer>
</SubContainer>
</AttrContainer>
</CompanyName>
我想改变例如'Images/afe2e194-0ce7-4bfc-b446-9623e4fe7189_grey_thumbnail.jpg'
到别的东西,并写回XML,主要的一点是,我不想删除或改变<unknown>
部分。
我编写了代码来读取我感兴趣的节点,代码可以读取它们并从中提取数据,但是当我没有关于其他节点的信息时,我如何编写重置?
xslt恒等转换是这类工作的一个很好的起点,即:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
然后,为您想要修改的xml
的元素添加一个模板。
如果需要在代码中执行,您可以按如下方式读取文件。
String FileContent = null;
using (StreamReader streamReader = new StreamReader(@"TheFile.xml"))
{
FileContent = streamReader.ReadToEnd();
}
XmlDocument Doc = new XmlDocument();
Doc.LoadXml(FileContent);
在代码中完成所需的修改后,可以将其保存回文件。
作为XSLT转换(非常适合任务)的替代方法,您可以只保存XML文档。
一个完整的方法:
- 读取文件到内存
- 找到您需要更改的元素(LINQ-to-XML, xpath,其他…)
- 更改文档中的元素
- 确保在此阶段关闭文档,否则请给文档一个新名称以允许保存
- 保存完整文档(例如使用XmlDocument.Save)