我有一个结构类似于下面的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
没有元素
我的问题:
这个代码有什么问题,我无法获得
CompanyName
元素?如何获得所有
<SubContainer>
元素的列表?当我得到
<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
}