如何在c#中解析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到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>元素列表时,我如何读取和更改其内容?

我想你应该用这个代替:

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

.Elements返回同名的子元素。CompanyName是你的根节点,你试图搜索它的子节点也就是AttrContainer

这段代码有什么问题,我无法获得companyname元素?

xml的根元素是CompanyName。所以你的代码在做什么,它本质上是要求'给我所有CompanyName元素是我的根CompanyName元素的孩子'。因此列表为空。

如何获得所有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";
      }
   }
}

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

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
}

相关内容

  • 没有找到相关文章

最新更新