Фильтрация тегов XML при загрузке в древовидную структуру - PullRequest
0 голосов
/ 12 мая 2009

Я пытаюсь загрузить файл XML в элемент управления древовидной структуры, отредактировать его и сохранить обратно в другом формате XML.

<MyConfig>
  <description>
    <![CDATA[Add All config data]]>
  </description>
  <group name="Server">
    <description>
      <![CDATA[Server info]]>
    </description>
    <parameter name="Host" type="string">
      <description>
        <![CDATA[Host Name]]>
      </description>
      <value>cccc.ac.lk</value>
    </parameter>
    <parameter name="Port" type="integer">
      <description>
        <![CDATA[port no]]>
      </description>
      <range>0-65536</range>
      <value>47110</value>
    </parameter>
  </group>
</MyConfig>

Я использую следующий метод для загрузки данных XML

private void populateTreeControl(System.Xml.XmlNode document, 
System.Windows.Forms.TreeNodeCollection nodes)
{
  foreach (System.Xml.XmlNode node in document.ChildNodes)
  {
    string text = (node.Value != null ? node.Value : 
      (node.Attributes != null && node.Attributes.Count > 0) ? 
        node.Attributes[0].Value : node.Name);
    TreeNode new_child = new TreeNode(text);
    nodes.Add(new_child);
    populateTreeControl(node, new_child.Nodes);
  }
}

Теперь я хочу отфильтровать некоторые узлы и загрузить их в виде дерева. В качестве примера для меня бесполезно загружать теги описания и т.д. в приведенном выше случае. Я просто хочу создать дерево с помощью MyConfig -> Group -> Server ---> Host и MyConfig -> Group -> Server ---> Port

Как мне изменить метод populateTreeControl (), чтобы получить это?

1 Ответ

1 голос
/ 12 мая 2009
private void populateTreeControl(
  System.Xml.Node context, 
  System.Windows.Forms.TreeNodeCollection treeNodes,
  List<string> xpath,
  int depth
)
{
  if (xpath.Count > depth) {
    foreach (System.Xml.XmlNode xmlNode in context.SelectNodes(xpath[depth]))
    {
      string text = "";
      if (xmlNode.Value != null) 
        text = xmlNode.Value;
      else if (xmlNode.Attributes.Count > 0)
        text = xmlNode.Attributes[0].Value;
      else 
        text = xmlNode.Name;

      TreeNode new_child = new TreeNode(text);
      treeNodes.Add(new_child);

      populateTreeControl(xmlNode, new_child.Nodes, xpath, depth + 1);
    }
  }
}

вызов как

List<string> xpath = new List<string>();
xpath.Add("/MyConfig/group/[@name='Server']");
xpath.Add("parameter[@name='Host' or @name='Port']");

populateTreeControl(xmlDoc, tree.Nodes, xpath, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...