直接上代码说明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>