0

それに対する具体的な答えを見つけることができませんでした

これが私の問題のXmlの例です

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

ChildNodes を持つすべての要素を取得したいのですが、単純なテキストを持つ要素は取得したくありません

この例では、Rectangle と Line をリストに入れたいと思います。

しかし、単純なテキストを含むノードに .HasChildNodes を要求すると、True が返され、ChildNode[0].Name として「#text」が返されます。

単純に .HasChildNodes を尋ねることはできません。どのノードが ChildNode としてノードを持ち、どのノードが「#text」を持つかを指定する他の方法を見つけることができませんでした。

だから私はこのようにXmlReaderを使ってみました:

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

これはすべての Xml ノードを返していますが、Node を ChildNode として持っている人だけが欲しいのですが、どうすればそれを行うことができますか?

前もって感謝します

4

2 に答える 2

0

そのために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> 
于 2013-07-02T21:06:40.637 に答える
0

使用しないでくださいXmlTextReader。新しい LINQ to XML API を使用します。

XDocument document = XDocument.Load(file);
List<XElement> elementsWithChildren = document.Descendants()
                                              .Where(x => x.Elements().Any());
于 2013-07-02T20:54:48.953 に答える