C#学习 - 关于XML文件的读写

直接上代码说明Xml读写

1. 写Xml

            XmlDocument myXml = new XmlDocument();
            XmlNode docNode = myXml.CreateXmlDeclaration("1.0", "UTF-8", null);

            myXml.AppendChild(docNode);
            XmlElement rootElem = myXml.CreateElement("Root");
            myXml.AppendChild(rootElem);

            CreateNodeTree(myXml, rootElem, definitions, "Child", "Property");

            myXml.Save(xmlFile);
        static void CreateNodeTree<T>(XmlDocument xmldoc, XmlElement parent, Dictionary<string, Tuple<string,List<T>>> dic, 
            string child_name, string child_value)
        {
            foreach (var avail in dic)
            {
                XmlElement e = xmldoc.CreateElement(child_name);
                e.SetAttribute("Name", avail.Key);
                e.SetAttribute("DisplayName", avail.Value.Item1);

                foreach (var value in avail.Value.Item2)
                {
                    XmlElement e2 = xmldoc.CreateElement(child_value);
                    if (typeof(T) == typeof(string))
                    {
                        e2.InnerText = value as string;
                    }
                    else if (typeof(T) == typeof(Tuple<string,string,string>))
                    {
                        var n = (value as Tuple<string, string, string>).Item1;
                        var d = (value as Tuple<string, string, string>).Item2;
                        var t = (value as Tuple<string, string, string>).Item3;

                        e2.SetAttribute("Name", n);
                        e2.SetAttribute("DisplayName", d);
                        if (enumDefinitions.ContainsKey(t))
                        {
                            e2.SetAttribute("Type", t);
                            foreach (var v in enumDefinitions[t])
                            {
                                XmlElement e3 = xmldoc.CreateElement("Enum-Value");
                                e3.InnerText = v as string;
                                e2.AppendChild(e3);
                            }
                        }
                        else if (stringAvailValues.ContainsKey(n) && t.GetType().Equals(typeof(string)))
                        {
                            e2.SetAttribute("Type", t);
                            e2.SetAttribute("AvailValues", "True");
                            foreach (var v in stringAvailValues[n])
                            {
                                XmlElement e3 = xmldoc.CreateElement("Value");
                                e3.InnerText = v as string;
                                e2.AppendChild(e3);
                            }
                        }
                        else
                        {
                            e2.SetAttribute("Type", t);
                        }

                    }
                    e.AppendChild(e2);
                }
                parent.AppendChild(e);
            }
        }

用到的变量

        static List<Type> customTypes = new List<Type>();
        static Dictionary<string, List<string>> stringAvailValues = new Dictionary<string, List<string>>();
        static Dictionary<string, List<string>> enumDefinitions = new Dictionary<string, List<string>>();
        static Dictionary<string, Tuple<string,List<Tuple<string, string, string>>>> definitions = 
            new Dictionary<string, Tuple<string, List<Tuple<string, string, string>>>>();

生成的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Child Name="SelectTechnology" DisplayName="Select Technology">
    <Property Name="technology" DisplayName="Technology" Type="System.String" AvailValues="True">
      <Value>CW</Value>
      <Value>GSM</Value>
      <Value>EDGE</Value>
      <Value>EVDO</Value>
      <Value>WCDMA</Value>
      <Value>CDMA2000</Value>
      <Value>LTE5MHZ</Value>
      <Value>LTE10MHZ</Value>
      <Value>LTE20MHZ</Value>
      <Value>LTETDD5MHZ</Value>
      <Value>LTETDD10MHZ</Value>
      <Value>LTETDD20MHZ</Value>
      <Value>TDSCDMA</Value>
      <Value>WLANN20MHZ</Value>
      <Value>WLANN40MHZ</Value>
      <Value>WLANAC20MHZ</Value>
      <Value>WLANAC40MHZ</Value>
      <Value>WLANAC80MHZ</Value>
      <Value>WLANAC160MHZ</Value>
      <Value>WLANAX20MHZ</Value>
      <Value>WLANAX40MHZ</Value>
      <Value>WLANAX80MHZ</Value>
      <Value>WLANAX160MHZ</Value>
      <Value>WLANA20MHZ</Value>
      <Value>WLANB20MHZ</Value>
      <Value>WLANG20MHZ</Value>
      <Value>WLANJ10MHZ</Value>
      <Value>WLANJ20MHZ</Value>
      <Value>WLANP5MHZ</Value>
      <Value>WLANP10MHZ</Value>
      <Value>WLANP20MHZ</Value>
      <Value>LTEA20_20MHZ</Value>
      <Value>LTEA20_20_20MHZ</Value>
      <Value>LTEATDD20_20MHZ</Value>
      <Value>LTEATDD20_20_20MHZ</Value>
      <Value>LTETDD_DL_5</Value>
      <Value>LTETDD_DL_20</Value>
      <Value>LTEATDD_DL_20_5CC</Value>
      <Value>5GNR_38.16MHZ</Value>
    </Property>
    <Property Name="cw_waveform" DisplayName="CW Waveform" Type="Enumeration.CW_WAVEFORM_TYPE">
      <Enum-Value>CW</Enum-Value>
      <Enum-Value>CW_POWER_RAMP</Enum-Value>
      <Enum-Value>CW_TWO_TONE</Enum-Value>
      <Enum-Value>CW_AND_MODULATION</Enum-Value>
    </Property>
    <Property Name="is_seq" DisplayName="Use Sequence" Type="System.Boolean" />
    <Property Name="is_dynamicEVM" DisplayName="Use Dynamic Operation" Type="System.Boolean" />
    <Property Name="duty_cycle" DisplayName="Duty Cycle" Type="System.Double" />
    <Property Name="lead_time" DisplayName="Lead Time" Type="System.Double" />
    <Property Name="lag_time" DisplayName="Lag Time" Type="System.Double" />
    <Property Name="trigger_delay" DisplayName="Trigger Delay" Type="System.Double" />
  </Child>
  <Child Name="Source_Analyzer_Setup" DisplayName="Source & Analyzer">
    <Property Name="src_amplitude" DisplayName="Amplitude" Type="System.Double" />
    <Property Name="src_frequency" DisplayName="Frequency" Type="System.Double" />
    <Property Name="rcv_amplitude" DisplayName="Amplitude" Type="System.Double" />
    <Property Name="rcv_frequency" DisplayName="Frequency" Type="System.Double" />
    <Property Name="triggerMode" DisplayName="Analyzer Trigger Mode" Type="Enumeration.AnalyzerTriggerModeEnum">
      <Enum-Value>AcquisitionTriggerModeImmediate</Enum-Value>
      <Enum-Value>AcquisitionTriggerModeExternal</Enum-Value>
      <Enum-Value>AcquisitionTriggerModeMagnitude</Enum-Value>
      <Enum-Value>AcquisitionTriggerModeWidebandMagnitude</Enum-Value>
      <Enum-Value>AcquisitionTriggerModeSoftware</Enum-Value>
      <Enum-Value>AcquisitionTriggerModeScheduler</Enum-Value>
    </Property>
    <Property Name="timeout" DisplayName="Analyzer Trigger Timeout Value" Type="System.Int32" />
  </Child>
</Root>

猜你喜欢

转载自blog.csdn.net/jianhui_wang/article/details/79926574