如何获取只能包含值的XML元素?

时间:2012-06-06 09:44:30

标签: c# winforms .net-2.0

我正在制作一个小程序,据说可以获得只能包含值的所有XML元素。例如(请参考下图), <Products>虽然它是一个元素,但不应该显示它,因为它只包含所有其他可以包含值的元素,对于{ {1}} (突出显示的那个,对不起我的英语,但希望你能帮我们......)

从下图中,我的程序应该只选择以下元素:

<Description>

<Material_Number> (2个元素,但不包括突出显示的元素)

<Description>

我实际得到的是什么......

enter image description here

请审核我的代码并提出建议:

<Language>  
<Material_Type>  
<Base_Unit> 

2 个答案:

答案 0 :(得分:0)

  1. 您的问题并不十分清楚,因为您所说的节点可以只包含一个值。由于在不知道底层架构的情况下无法知道给定节点可以包含或不包含的内容,我将假设您实际上是指执行仅包含值的节点。
  2. (w.l.o.g.)<Language>元素中的文本值是文本节点。因此,inXmlNode.HasChildNodes也会为这些节点评估true。您必须检查是否有任何子节点的NodeType属性设置为XmlNodeType.Element,如果是,请跳过该元素。
  3. 请注意,所选响应仅适用于特定情况。只要您的Xml文档包含<Language><x/></Language>之类的内容,<Language>元素就会出现在列表框中,即使它没有文本内容。如果Xml文档包含<Language><x/><y/><z/></Language>,则<Language>甚至会在结果集中出现三次。

答案 1 :(得分:0)

你可以稍微缩短你的代码但你应该开始调用从第一个元素开始。

  GetElements(xmldoc.ChildNodes[0]); 
    void GetElements(XmlNode inXmlNode)
    {
        if(inXmlNode.HasChildNodes)
        {
            foreach (XmlNode childNode in inXmlNode.ChildNodes)
            {
                GetElements(childNode);
            }
        }
        else
        {
            listBox1.Items.Add(inXmlNode.ParentNode.Name);
        }
    }