質問

I have a XML that has a structure similar to this one:

<?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>

and I am trying to parse it using this code (Linq to XML)

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

but it x has no element.

My questions:

  1. What is wrong with this code that I am not able to get the CompanyName element?

  2. How can I get list of all <SubContainer> elements?

  3. When I got the list of <SubContainer> elements, how can I read read and change its content?

役に立ちましたか?

解決 2

What is wrong with this code that I am not able to get the companyname element?

The root element of your xml is CompanyName. So what your code is doing, it's essentially asking 'give me all CompanyName elements that are children of my root CompanyName element'. Hence the list is empty.

how can I get list of all SubContainer elements.

You can use

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

when I got the list of SubContainer elements, how can I read read and change its content?

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";
      }
   }
}

This reads and changes the type on each first Attr element (assuming one exists) in all AttrContainers in all SubContainers - hopefully you can derive something meaningful out of that.

他のヒント

I think you want this instead:

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

.Elements returns child elements of that name. CompanyName is you root node, and you're trying to search for its children which are AttrContainer.

doc.Root returns the element <CompanyName>, so further selecting elements named CompanyName won't return any elements. You're effectively trying to select all <CompanyName> elements that are children of <CompanyName>.

This code will select all <SubContainer> elements no matter their depth. I'm suggesting this because your example XML has several <SubContainer> elements.

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

foreach (XElement subContainerElement in subContainerElements)
{
    // Work with <SubContainer> element here
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top