当您只了解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>部分。

我编写了代码来读取我感兴趣的节点,代码可以读取它们并从中提取数据,但是当我没有关于其他节点的信息时,我如何编写重置?

当您只了解xml结构体的一部分时,如何读取xml并将其写回来

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)