XML解析。隐藏父节点

时间:2015-03-13 02:26:53

标签: c# xml parsing treeview .net-2.0

所以我有一个解析为TreeView列表的xml文件,目前我只有四个级别的节点,而我只想要三个。我想隐藏/删除父节点或顶级节点,因为它没有多大用处。我可以通过编辑XML文件本身来做到这一点,但我不允许这样做。这是代码:

private void Form1_Load_1(object sender, EventArgs e)
    {
        // Initialize the controls and the form.
        textBox2.Text = Application.StartupPath + "\\Continental.vsysvar";
    }

    private void button6_Click(object sender, EventArgs e)
    {
        treeView1.BeginUpdate();
        try
        {
            // SECTION 1. Create a DOM Document and load the XML data into it.
            XmlDocument dom = new XmlDocument();
            dom.Load(textBox2.Text);
            // SECTION 2. Initialize the TreeView control.
            try
            {
                // SECTION 2. Initialize the TreeView control.
                //treeView1.Nodes.Clear();
                XmlTreeViewHelper.AddOrMergeNodes(treeView1.Nodes, dom.DocumentElement.ChildNodes, GetTreeNodeName, GetTreeNodeText, FilterNode);
                // SECTION 3. Populate the TreeView with the DOM nodes.
                treeView1.ExpandAll();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                treeView1.EndUpdate();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    static string GetTreeNodeName(XmlNode inXmlNode)
    {
        string text = GetAttributeText(inXmlNode, "name");
        if (string.IsNullOrEmpty(text))
            text = inXmlNode.Name;
        return text;
    }

    static string GetTreeNodeText(XmlNode inXmlNode)
    {
        string text = GetAttributeText(inXmlNode, "name");
        if (string.IsNullOrEmpty(text))
        {
            if (inXmlNode.HasChildNodes)
            {
                text = inXmlNode.Name;
            }
            else
            {
                text = (inXmlNode.OuterXml).Trim();
            }
        }
        return text;
    }

    string filter = "_start"; // Reload when this changes.

    bool FilterNode(XmlNode inXmlNode)
    {
        return FilterNode(inXmlNode, filter);
    }

    bool FilterNode(XmlNode inXmlNode, string nodeNameFilter)
    {
        if (inXmlNode.Name == "namespace" && inXmlNode.ChildNodes.Count == 0 && string.IsNullOrEmpty(GetAttributeText(inXmlNode, "name")))
            return false;
        if (!string.IsNullOrEmpty(nodeNameFilter))
        {
            string text = GetTreeNodeText(inXmlNode);
            if (text.Contains(nodeNameFilter))
                return false;
        }
        return true;
    }
    static string GetAttributeText(XmlNode inXmlNode, string name)
    {   
        XmlAttribute attr = (inXmlNode.Attributes == null ? null : inXmlNode.Attributes[name]);
        return attr == null ? null : attr.Value;
    }

有一个名为XmlTreeViewHelper的类,但是它很长,所以我决定不在这里包含它(它的主要目的是过滤具有特定字符串集的节点) )。如果我还需要在此处提供,请告诉我。

无论如何,当我点击按钮时,结果将是这样的:

命名空间
| --- A类 | -------对象A1
| -------对象A2
| --- B类 | -------对象B1
| -------对象B2

如何隐藏命名空间?我不允许在xml文件本身上删除它。该列表应仅显示“类别”和“对象”。仅供参考,命名空间在列表中显示为命名空间。下面是XML文件的示例。

<?xml version="1.0" encoding="utf-8"?>
<systemvariables version="4">
  <namespace name="" comment="">
    <namespace name="_01_Test_Preparation" comment="">
      <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="_01_02_Shipping_Status_Check" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="4" maxValuePhys="4" />
      <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="_01_02_Shipping_Status_Check_start" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="4" maxValuePhys="4" />
    </namespace>
    <namespace name="_02_Communication" comment="">
      <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="_02_04_VCAN_StartLoad" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="4" maxValuePhys="4" />
      <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="_02_08_XCP_Restbus_RAM_Monitor" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="4" maxValuePhys="4" />
    </namespace>
  </namespace>
</systemvariables>

我认为如果名称空间的属性名称为空,则不会包含在列表中。或者至少它不会被展示出来。这可能吗?我在Web上找到的大多数示例都关注删除没有子节点的父节点,但在我的例子中,这个父节点有子节点。

1 个答案:

答案 0 :(得分:1)

最简单的方法是加载ChildNodes ChildNodes的{​​{1}},而不是DocumentElement的{​​{1}}。< / p>

首先,更改ChildNodes以使用任何IEnumerable<XmlNode>

DocumentElement

然后,只需将文档中的节点加载到文档的下一级:

XmlTreeViewHelper.AddOrMergeNodes()