如何在不知道特定XmlNode名称的情况下读取它

本文关键字:情况下 读取 XmlNode 不知道 | 更新日期: 2023-09-27 18:20:50

找不到该的具体答案

以下是我的问题的Xml示例

<Rectangle>
    <elementcolor>blue</elementcolor>
    <elementwidth>200</elementwidth>
</Rectangle>
<Line>
    <elementcolor>red</elementcolor>
    <elementwidth>150</elementwidth>
</Line>

我想得到所有有ChildNodes的元素,我不想得到那些有简单文本的元素

在这个例子中,我想把矩形和直线放在一个列表中。

但是当询问.HasChildNodes到那些包含简单文本的节点时,他们会返回我True和ChildNode[0]。Name他们会返回"#text"。

我不能简单地问HasChildNodes,我找不到其他方法来指定哪个节点有一个node作为ChildNode,哪个节点有"#text"

所以我尝试使用XmlReader,方法是:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element)
    {
        list.Add(reader.Name);   
    }
}

这将返回我所有的Xml节点,但我只希望那些将节点作为ChildNode的节点,我该怎么做?

提前感谢

如何在不知道特定XmlNode名称的情况下读取它

您可以使用linq2xml。。。

var xml = @"<wrapper>
<Rectangle>
    <elementcolor>blue</elementcolor>
    <elementwidth>200</elementwidth>
</Rectangle>
<Rectangle/>
<Line/>
<Line>
    <elementcolor>red</elementcolor>
    <elementwidth>150</elementwidth>
</Line>
</wrapper>";
var elements = XElement
    .Parse(xml)
    .Descendants()
    .Where(o => o.HasElements);
elements.Dump();

输出

<Rectangle>
  <elementcolor>blue</elementcolor>
  <elementwidth>200</elementwidth>
</Rectangle> 
<Line>
  <elementcolor>red</elementcolor>
  <elementwidth>150</elementwidth>
</Line> 

不要使用XmlTextReader。使用新的LINQ to XML API:

XDocument document = XDocument.Load(file);
List<XElement> elementsWithChildren = document.Descendants()
                                              .Where(x => x.Elements().Any());