【问题标题】:C# XML parser - how to get: innerxml & innerText (xml attributes not xml element name)?C# XML 解析器 - 如何获取:innerxml & innerText(xml 属性不是 xml 元素名称)?
【发布时间】:2015-07-09 20:50:55
【问题描述】:

我尝试将我的 XML 文件加载到树视图中,但我没有这样做。只有我得到元素名称。我希望我的树视图加载带有 XML 属性。我的问题是如何获取 XML 属性来加载我的树视图?

亲切的问候,

主窗体 这是我初始化 XML 文件的表单。

public Form1()
{
    InitializeComponent();

    // Create an instance of the open file dialog box.
    // This is test purpose only. In production xml files will come from SQL Database.
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    // Set filter options and filter index.
    openFileDialog1.Title = "Please Choose XML File";
    openFileDialog1.Filter = "XML Files (.xml)|*.xml|All Files (*.*)|*.*";
    openFileDialog1.FilterIndex = 1;// varsayılan olarak jpg uzantıları göster
    openFileDialog1.Multiselect = false;

    // Call the ShowDialog method to show the dialog box.
    openFileDialog1.ShowDialog();

    XmlDataDocument xmldoc = new XmlDataDocument();
    XmlNode xmlnode;
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
    xmldoc.Load(fs);
    xmlnode = xmldoc.ChildNodes[1];
    treeView1.Nodes.Clear();
    treeView1.Nodes.Add(new TreeNode(xmldoc.DocumentElement.Name));
    TreeNode tNode;
    tNode = treeView1.Nodes[0];
    AddNode(xmlnode, tNode);
}

XML 加载 这是我的 xml 加载子。

        // XML NODE: ADD
        private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
        {
            XmlNode xNode;
            TreeNode tNode;
            XmlNodeList nodeList;
            int i = 0;
            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;
                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
                    tNode = inTreeNode.Nodes[i];
                    AddNode(xNode, tNode);
                }
            }
            else
            {
                inTreeNode.Text = inXmlNode.InnerText.ToString();
            }
        }

这是 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<Menu>
  <AgencyType id="1" name="WATER" Active="Y">
    <AgencyCode id="1" name="FRESH" Active="Y">
      <TypeOfBills id="1" name="INTKON" Active="Y">
        <PaymentType id="1" name="AA" Active="Y"></PaymentType>
        <PaymentType id="2" name="BB" Active="N" /></PaymentType>
        <PaymentType id="3" name="CC" Active="N"></PaymentType>
      </TypeOfBills>
    </AgencyCode>
  </AgencyType>
</Menu>

原始 XML 文件 这是我构建 xml 文件的“XML Notepad 2007”应用程序。

树视图 XML 加载 当我加载我的 xml 数据后,这就是我的树视图在表单上显示的方式。

【问题讨论】:

  • 以文字而非图片的形式发布代码。它更容易阅读,然后我们可以复制和粘贴。同样,将 XML 文件作为文本发布 - 最好是一个简短但完整的文件,其中包含一个简短但完整的控制台应用程序来演示问题。
  • 你可以使用 XmlNode.InnerXml 和 XmlNode.InnerText 属性
  • 不,你没有。您没有将 XML 文件显示为文本,也没有显示一个简短但完整的控制台应用程序来演示该问题。 (UI 部分在这里是偶然的,IMO。)我强烈建议使用 LINQ to XML 而不是 XDocument,顺便说一句 - 它更干净。
  • 谢谢乔恩,我忘记将 xml 添加为文本。没有任何唯一的用户界面。 UI 只有 Treeview 控件。
  • @Apple 你在 (xNode = inXmlNode.ChildNodes[i];) 代码中使用 XmlNode.InnerXml 是什么意思? XmlNode.InnerXml 有很长的线分隔间隔反斜杠。 !!!

标签: c# xml winforms attributes treeview


【解决方案1】:

谢谢。我做到了。这里是。我使用了“XElement”,它的加载速度非常快。

主要:

using System.Xml.Linq; 

public Form1()
{
    InitializeComponent();

    // Create an instance of the open file dialog box.
    // This is test purpose only. In production xml files will come from SQL Database.
    OpenFileDialog openFileDialog1 = new OpenFileDialog();

    // Set filter options and filter index.
    openFileDialog1.Title = "Please Choose XML File";
    openFileDialog1.Filter = "XML Files (.xml)|*.xml|All Files (*.*)|*.*";
    openFileDialog1.FilterIndex = 1;
    openFileDialog1.Multiselect = false;

    // Call the ShowDialog method to show the dialog box.
    openFileDialog1.ShowDialog();

    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);

    var data = XElement.Load(openFileDialog1.FileName);
    TreeNode treeNode = treeView1.Nodes.Add("Menu");
    LoadElements(data, treeNode);

    //Clear ListBox items
    ListBoxMain.Items.Clear();

    //Load ListBox First time
    foreach (TreeNode n in treeView1.Nodes)
    {
            ListBoxMain.Items.Add(n.Text);
    }
}

加载元素

private void LoadElements(XElement xElem, TreeNode treeNode)
{
    foreach (XElement element in xElem.Elements())
    {
        if (element.HasElements)
        {
            if (element.FirstAttribute != null)
            {
                TreeNode tempNode = treeNode.Nodes.Add(element.FirstAttribute.Value + "." + element.Attribute("name").Value);
                LoadElements(element, tempNode);
            }
            else
            {
                LoadElements(element, treeNode);
            }
        }
        else
            treeNode.Nodes.Add(element.FirstAttribute.Value + "." + element.Attribute("name").Value);
    }
}

【讨论】:

    【解决方案2】:

    试试这样的

            else
            {
                inTreeNode.Text = inXmlNode.InnerText.ToString();
                //add new code here
                XmlNode inXmlNode = null;
                XmlAttributeCollection attributes = null;
                inXmlNode.Attributes.CopyTo(atttributes);
                foreach(XmlAttribute attribute in attributes)
                {
                   string name = attribute.Name;
                   string value = attribute.Value;
                }
            }

    【讨论】:

    • 谢谢@jdweng。我只得到“AgencyType”,但没有得到另一个子节点。
    • 我只将代码放在叶子(没有子节点)中,而不是在中间节点中。我只是得到了属性,并没有将属性放入树中。留给你做。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2012-04-14
    • 1970-01-01
    相关资源
    最近更新 更多