////// Creates an XmlElement from a stream /// /// /// XmlElement pointing to the root of the XML public static XmlElement CreateXmlNode(Stream stream) { XmlElement xmlElement; XmlDocument doc = new XmlDocument(); using (stream) { doc.Load(stream); } xmlElement = doc.DocumentElement; return xmlElement; }
本段代码用传入的数据流生成XML文档(XmlDocument),并取得文档的根(DocumentElement)。
////// Read the API endpoints /// public static Hashtable ReadEndpoints(XmlNode root) { if (root == null) { throw new ArgumentNullException("node"); } Hashtable endpoints = new Hashtable(); XmlNodeList environmentNodes = root.SelectNodes("wsdl/environment"); foreach (XmlNode environmentNode in environmentNodes) { string environment = environmentNode.SelectSingleNode("@name").Value; foreach (XmlNode portNode in environmentNode.SelectNodes("port")) { bool isThreeToken = IsThreeToken(portNode); XmlNode portNameAttributeNode = portNode.SelectSingleNode("@name"); LogIfNull(portNameAttributeNode, "port name attribute not found in endpoints"); if (NonNull(portNameAttributeNode)) { string port = portNameAttributeNode.Value; string url = portNode.InnerText; string endpointKey = GetEndpointKey(environment, port, isThreeToken); Endpoint endpoint = new Endpoint(environment, port, isThreeToken, url); endpoints.Add(endpointKey, endpoint); if (log.IsDebugEnabled) { log.Debug(MessageResources.GetMessage("ENDPOINT_FOUND")+ "'" + endpointKey + "', environment: '" + environment + "', port: '" + port + "'"); } } } } return endpoints; }
本段代码从传入的根节点中读取各接点的属性(attribute)和值(InnerText)
其中值得注意的是:
1)XmlNodeList environmentNodes = root.SelectNodes("wsdl/environment");
这表示从根节点一直读到environment节点,并获得environment的列表。
备注:节点路径为Root -> wsdl -> enviroment -> port
2)string environment = environmentNode.SelectSingleNode("@name").Value;
可以获得该节点属性名为name的属性值。
3)string url = portNode.InnerText;
获得节点的值
两端代码结合使用如下:
XmlNode defaultEndpointsNode = Utils.CreateXmlNode(DefaultEndpointsStream); this.endpoints = ConfigSectionParser.ReadEndpoints(defaultEndpointsNode);