对于某些API接口,除了会返回Json格式的数据外,还可能遇到返回的XML格式的数据。

接受信息(无论json还是xml都可以用下面的代码接收数据)

                Stream inputstream = Request.InputStream;
                byte[] b = new byte[inputstream.Length];
                inputstream.Read(b, 0, (int)inputstream.Length);

                string xml= UTF8Encoding.UTF8.GetString(b);

                或

                Stream postData = Request.InputStream;
                StreamReader sRead = new StreamReader(postData);
                string postContent = sRead.ReadToEnd();
                

解析:
使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.
最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性

   1: xn 代表一个结点
   2: xn.Name;//这个结点的名称
   3: xn.Value;//这个结点的值
   4: xn.ChildNodes;//这个结点的所有子结点
   5: xn.ParentNode;//这个结点的父结点

对于只有一级的xml数据结构可以直接这样

        //根据xml节点获取对应的值
        public string GetXMLNodeValue(string xml, string node)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            XmlElement root = null;
            root = doc.DocumentElement;

            XmlNodeList listNodes = root.SelectNodes(node);

            return listNodes[0].InnerText;
        }

对于比较复杂的xml数据结构,需要获取所有子节点然后进行遍历

          // 得到根节点bookstore
          XmlNode xn = xmlDoc.SelectSingleNode("root");
          // 得到根节点的所有子节点
          XmlNodeList xnl = xn.ChildNodes;

          foreach (XmlNode xn1 in xnl)
          {
          //将节点转换为元素,便于得到节点的属性值
           XmlElement xe = (XmlElement)xn1;
           string attr1= xe.GetAttribute("attr1").ToString();
           string attr2= xe.GetAttribute("attr2").ToString();

          //得到Book节点的所有子节点
           XmlNodeList xnl0 = xe.ChildNodes;
           string childnode1=xnl0.Item(0).InnerText;
           string childnode2=xnl0.Item(1).InnerText;
           string childnode3=xnl0.Item(2).InnerText;
     

温馨提示:
假如xml含有注释,需要在读取xml之前设置忽略文档里面的注释,防止将注释当做节点,导致程序异常

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释