如何在c#中解析XML文件

时间:2014-03-21 14:22:04

标签: c# xml linq linq-to-xml

我有一个类似于这个结构的XML:

<?xml version="1.0" encoding="UTF-8"?>
<CompanyName>
    <AttrContainer>
        <Attr type="String">
            <Name value="'Name'" />
            <Value value="'AttrContainer'" />
        </Attr>
        <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>

我正在尝试使用此代码解析它(Linq to XML)

 var xmlContent = File.ReadAllText(filePathName);
 var doc = XDocument.Parse(xmlContent);
 var attr = doc.Root.Elements("CompanyName");
 var x = attr.ToList();

x没有元素。

我的问题:

  1. 这段代码有什么问题我无法获得CompanyName元素?

  2. 如何获取所有<SubContainer>元素的列表?

  3. 当我获得<SubContainer>元素列表时,如何阅读并更改其内容?

3 个答案:

答案 0 :(得分:3)

我想你想要这个:

var attr = doc.Root.Elements("AttrContainer");

.Elements返回该名称的子元素。 CompanyName是您的根节点,并且您正在尝试搜索AttrContainer的子节点。

答案 1 :(得分:1)

doc.Root返回元素<CompanyName>,因此进一步选择名为CompanyName的元素将不会返回任何元素。您实际上是在尝试选择<CompanyName>的所有<CompanyName>个子元素。

此代码将选择所有<SubContainer>元素,无论其深度如何。我建议这样做,因为您的示例XML有几个<SubContainer>元素。

// Read all Attr elements
IEnumerable<XElement> subContainerElements = doc.Root.Descendants("SubContainer");

foreach (XElement subContainerElement in subContainerElements)
{
    // Work with <SubContainer> element here
}

答案 2 :(得分:1)

此代码有什么问题,我无法获取companyname元素?

xml的根元素是CompanyName。因此,您的代码正在做什么,它本质上要求“给我所有CompanyName元素,这些元素是我的根CompanyName元素的子元素&#39;。因此列表是空的。

如何获取所有SubContainer元素的列表。

您可以使用

var subContainers = doc.Root.Descendants("SubContainer");

当我获得SubContainer元素列表时,如何阅读并更改其内容?

foreach (var subContainer in subContainers)
{
   foreach (var attrContainer in subContainer.Elements("AttrContainer"))
   {
      var attr = attrContainer.Elements("Attr").FirstOrDefault();
      if (attr != null)
      {
         var oldValue = attr.Attribute("type").Value;
         attr.Attribute("type").Value = "something completely different";
      }
   }
}

这会在所有Attr中的所有AttrContainers中读取并更改每个第一个SubContainers元素的类型(假设存在一个) - 希望您可以从中获得有意义的内容。