当你只理解它的一部分结构时,如何读取xml并将其写回

时间:2014-03-24 10:38:44

标签: c# xml

我有一个可能包含几种类型节点的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>部分。

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

3 个答案:

答案 0 :(得分:1)

xslt identity transform是这类工作的一个很好的起点,即:

<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元素添加模板。

答案 1 :(得分:0)

如果需要在代码中进行操作,可以按如下方式阅读文件。

String FileContent = null;
using (StreamReader streamReader = new StreamReader(@"TheFile.xml"))
{
    FileContent = streamReader.ReadToEnd();
}
XmlDocument Doc = new XmlDocument();
Doc.LoadXml(FileContent);

在代码中进行了所需的修改后,可以将其保存回文件。

答案 2 :(得分:0)

作为XSLT转换的替代方法(非常适合任务),您只需保存XML文档即可。

完整的方法:

  • 将文档读入内存
  • 找到您需要更改的元素(LINQ-to-XML,xpath,其他...)
  • 更改文档中的元素
  • 确保在此阶段关闭文档,否则为文档指定一个新名称以允许保存
  • 保存完整文档(例如使用XmlDocument.Save