Итак, у меня есть XML-файл, обработанный списком TreeView, в настоящее время у меня есть четыре уровня узлов, когда мне нужно только три. Я хочу скрыть/удалить родительский узел или верхний узел, так как он не очень полезен. Я мог бы это сделать, отредактировав сам файл XML, но мне не разрешено. Вот код:XML Parsing. Скрыть родительский узел
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. В списке должны отображаться только категории и объекты. FYI, пространство имен отображается в списке как пространство имен. Ниже приведен образец 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>
Я думаю, что если имя атрибута пространства имен пуст, оно не будет включено в список. или, по крайней мере, он не будет показан. Это возможно? Большинство примеров, которые я нашел в Интернете, касаются удаления родительских узлов без дочерних узлов, но в моем случае этот родительский узел имеет дочерние узлы.
Ухм вау. это сработало. Но я вообще не знаком с IEnumerable, для чего он нужен? – Kurisuchin
@ Kurisuchin - это общий интерфейс для прохождения через что-то. Более простой, чем 'ICollection', потому что у него нет метода 'Count'. –
dbc