Reputation: 18168
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.
What is wrong with this code that I am not able to get the CompanyName
element?
How can I get list of all <SubContainer>
elements?
When I got the list of <SubContainer>
elements, how can I read read and change its content?
Upvotes: 1
Views: 186
Reputation: 7961
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
}
Upvotes: 1
Reputation: 5402
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.
Upvotes: 1
Reputation: 4860
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
.
Upvotes: 3