我有一个类似于这个结构的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
没有元素。
这段代码有什么问题我无法获得CompanyName
元素?
如何获取所有<SubContainer>
元素的列表?
当我获得<SubContainer>
元素列表时,如何阅读并更改其内容?
答案 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
元素的类型(假设存在一个) - 希望您可以从中获得有意义的内容。