【问题标题】:How would I parse my own XML..?我将如何解析我自己的 XML ..?
【发布时间】:2015-01-29 23:53:07
【问题描述】:

我制作了这个 XML 文件,我需要尝试从中生成 GUI。不,如果您想知道,我不会跳到 WPF :-)

这是我制作的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <gui groupboxlabel="Barnets Stamdata" type="CHILD">
        <textbox label="CPR" />
        <textbox label="Navn" />
        <textbox label="Efternavn" />
        <textbox label="Addresse" />
        <textbox label="Hus nr." />
        <textbox label="Opgang" />
        <textbox label="Post Nr." />
        <textbox label="By" />
        <textbox label="Email" />
        <textbox label="Telefon nr." />
        <textbox label="Sagsbehandler" />
        <textbox label="Konsulent" />
        <textbox label="Aflastning" />
        <!-- <combobox label="Foranstaltning" /> -->
        <!-- <date label="Anbring" /> -->
        <!-- <date label="Udskriv" /> -->
    </gui>
</root>

我需要先找到gui 标签,这样我才能提取那里的两条信息。然后我必须为那里的每个文本框子项制作一个带有特定标签名称的自定义文本框控件。

我最初尝试做这样的事情来尝试打印出它的样子,但是代码不起作用,因为我找到的子节点为空:

public void CreateNewLayout(Form parent, String path, String token)
{
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(path);

    XmlNodeList gui = xmlDoc.GetElementsByTagName("gui");
    if (gui.Count == 0)
    {
        MessageBox.Show("XML fil har ingen elementer", "Fejl");
        return;
    }
    while (gui.GetEnumerator().MoveNext())
    {
        gui.GetEnumerator().Current.ToString();
    }
}

问题是,我的 XML 已经很生锈了...有什么帮助吗?

【问题讨论】:

  • 您希望while 循环能做什么? gui.GetEnumerator().MoveNext() 不会通过子节点 ;-)

标签: c# xml winforms


【解决方案1】:

你可以使用 Linq-Xml

var document = XDocument.Parse(inputXmlString);

document
.Root
.Element("gui")
.Elements()
.Select(element =>
   new
   {
       Type = element.Name,
       Label = element.Attribute("label").Value,
   })
.Dump();

这是Linqpad 中的一个简单示例,用于展示如何将您的 XML 转换为匿名类型。它不必是匿名类型,它可以是你想要的类型......

另外,如果要过滤元素,请将元素名称传递给.Elements(string)

【讨论】:

    【解决方案2】:

    我建议为您的文本框节点提供不同的值,例如 textbox1、textbox2...

        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        List<string> labels = new List<string>();
        doc.LoadXml([This would be text from file]);
        string groupboxlabel = doc.SelectSingleNode("root/gui").Attributes["groupboxlabel"].Value;
        string type = doc.SelectSingleNode("root/gui/textbox").Attributes["type"].Value;
        System.XmlNodeList nodeList = doc.SelectNodes("root/gui");
        foreach (XmlNode node in nodeList)
        {
            labels.Add(node.Attributes["label"].Value;);//Now you will have a list of labels
        }
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      使用这样的东西:

      XDocument document = XDocument.Load(@"C:\DOTNET\PRACTICE\XmlTest\XmlTest\XMLFile1.xml");
      
      XElement guiNode = document.Root.Element("gui");
      
      List<XAttribute> attributes = new List<XAttribute>();
      
      foreach(var attribute in guiNode.Attributes())
      {
          attributes.Add(attribute);
      }
      

      这使用 XDocument API 而不是旧的 XMLDocument API。您可以在任何需要的地方添加空检查。

      【讨论】:

        猜你喜欢
        • 2014-12-21
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多