1

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

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

<Material_Number> 

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

<Language>  
<Material_Type>  
<Base_Unit> 

我实际上得到的什么都没有...

在此处输入图像描述

请检查我的代码并建议:

public MainForm()
        {
            InitializeComponent();

            XmlDataDocument xmldoc = new XmlDataDocument();
            XmlNode xmlnode;

            FileStream fs = new FileStream(@"C:\text.xml", FileMode.Open, FileAccess.Read);
            xmldoc.Load(fs);

            xmlnode = xmldoc.ChildNodes[1];
            GetElements(xmlnode);                       
        }

        void GetElements(XmlNode inXmlNode)
        {
            XmlNode xNode;
            XmlNodeList nodeList;

            int i = 0;

            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;

                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    string ss = xNode.Name;
                    GetElements(xNode);
                }
            }
            else
            {
                listBox1.Items.Add(inXmlNode.Name); 
            }
        }
4

2 回答 2

0
  1. 您的问题不太清楚,因为您正在谈论只能包含值的节点。由于在不知道底层架构的情况下不可能知道给定节点可以或不能包含什么,我将假设您实际上是指包含一个值的节点。
  2. (wlog)<Language>元素中的文本值是一个文本节点。因此,也对这些节点inXmlNode.HasChildNodes进行评估。true您必须检查是否有任何子节点的NodeType属性设置为XmlNodeType.Element,如果是,则跳过该元素。

请注意,所选响应仅在特定情况下有效。只要您的 Xml 文档包含类似的内容<Language><x/></Language>,该<Language>元素就会出现在列表框中,即使它没有文本内容。如果 Xml 文档包含<Language><x/><y/><z/></Language>,<Language>甚至会在结果集中出现 3 次。

于 2012-06-06T09:59:39.230 回答
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);
        }
    }
于 2012-06-06T10:16:49.643 回答