我的xml文件是这样的
<?xml version="1.0" encoding="utf-8" ?>
<StoredProcedureList>
  <StoredProcedure ID = "usp_get_gpxx">
    <Parameters>      <Name>gpdm</Name>
      <Type>char</Type>
    </Parameters>  </StoredProcedure >
  
</StoredProcedureList>
如果用xmltextreade读取其中parameters下的name和type值。谢谢

解决方案 »

  1.   

    using System;
    using System.Xml;
    using System.Collections.Generic;public class MyClass
    {
        public static void Main()
        {
            try
            {
                string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
    <StoredProcedureList>
    <StoredProcedure ID = ""usp_get_gpxx"">
    <Parameters>
    <Name>gpdm</Name>
    <Type>char</Type>
    </Parameters>
    </StoredProcedure >
    </StoredProcedureList>";
                XmlTextReader xtr = new XmlTextReader(str,XmlNodeType.Element,null);
                while (xtr.Read()) {
                    if (xtr.Name == "Parameters")
                    {
                        xtr.Read();
                        string key = string.Empty;
                        Dictionary<string, string> result = new Dictionary<string, string>();
                        while ( xtr.Name != "Parameters")
                        {
                            if(XmlNodeType.Element == xtr.NodeType){
                                key = xtr.Name;
                            }
                            else if (XmlNodeType.Text == xtr.NodeType) {
                                result.Add(key, xtr.Value);
                            }
                            xtr.Read();
                        }
                        foreach (string k in result.Keys) {
                            Console.WriteLine("{0}:{1}", k, result[k]);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                Console.WriteLine("END");
                Console.Read();
            }
        }
    }只是我不明白为什么一定要用xmltextreader去读?
      

  2.   

    XmlDocument xd = new XmlDocument();
                xd.LoadXml(str);
                XmlNode xn = xd.SelectSingleNode("//Parameters");
                foreach (XmlNode x in xn.ChildNodes) {
                    Console.WriteLine("{0}:{1}",x.Name,x.InnerXml);
                }
    使用xpath来查不是更方便吗
      

  3.   

    to:blackant2(乔峰) 
    这样写执行到  XmlTextReader xtr = new XmlTextReader(str,XmlNodeType.Element,null);
    xtr的值=“\r\n”
    是否我的xml文件写得有问题?
      

  4.   

    我的xml是写在当前路径下的一个xml文件里
    我的程序中这样写
      XmlDocument xd = new XmlDocument();
       xd.LoadXml("G:/vs/XMLFile1.xml");
    但是执行到loadxml后会报“data at the root level is invalid,line 1,position 1”
      

  5.   

    \r\n也是xml的一个节点
    节点类型为空白(whitespace)英文好外是这个
    这是正常的
    比如
    <?xml version=""1.0"" encoding=""utf-8"" ?>
    <StoredProcedureList>
    <StoredProcedure ID = ""usp_get_gpxx"">
    每个element类型的节点之后都有一个"\r\n"的whitespace节点
    mlDocument xd = new XmlDocument();
    xd.LoadXml("G:/vs/XMLFile1.xml");
    这个时候应该使用xd.load而不是loadxml
    相关问题可以参考msdn的帮助
      

  6.   

    谢谢,
    再请问,如果xml文件中有多个<StoredProcedure ID = "">
    程序中想根据传入的参数找到对应的id如(id="usp_get_gpxx")这个节点的下面的所有<Parameters>
    ,该怎么办?谢谢
      

  7.   

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(Server.MapPath("your.xml"));
    XmlNode xmlnode = doc.SelectSingleNode(//跟节点//StoredProcedure[@id="5");
    if (xmlnode != null)
    {
      Labe1.text=xmlnode.Attribut.["menuName"].Value.ToString();                        
      Labe2.text=xmlnode.Attribut.["menuName"].Value.ToString();                        
      Labe3.text=xmlnode.Attribut.["menuName"].Value.ToString();                        
    }
      

  8.   

    using System;
    using System.Xml;
    using System.Collections.Generic;public class MyClass
    {
        public static void Main()
        {
            try
            {
                string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
    <StoredProcedureList>
    <StoredProcedure ID=""usp_get_gpxx"">
    <Parameters>
    <Name>name1</Name>
    </Parameters>
    <Parameters>
    <Type>type1</Type>
    </Parameters>
    <Parameters>
    <Name>name2</Name>
    <Type>type2</Type>
    </Parameters>
    </StoredProcedure >
    </StoredProcedureList>";
                XmlDocument xd = new XmlDocument();
                xd.LoadXml(str);
                string id="usp_get_gpxx";
                string xpath = string.Format(@"//StoredProcedure[@ID=""{0}""]/Parameters", id);
                XmlNodeList xnl = xd.SelectNodes(xpath);
                foreach (XmlNode xn in xnl) {
                    Console.WriteLine("parameters:");
                    foreach (XmlNode x in xn)
                    {
                        Console.WriteLine("{0}:{1}",x.Name,x.InnerXml);
                    }
                }
           
                
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                Console.WriteLine("END");
                Console.Read();
            }
        }
    }有关xpath查询可以参见
    http://www.w3.org/TR/xpath
    中文
    http://www.opendl.com/openxml/w3/TR/xpath/xpath-gb.html这儿//StoredProcedure[@ID=""{0}""]/Parameters
    表示
    //                 任意层下
    StoredProcedure    名为StoredProcedure的节点
    [@ID="usp_get_gpxx"] 并且此节点具有值为usp_get_gpxx的ID属性
    /Parameters        再下一层的Parameters节点
      

  9.   

    我把xml改成这样:
    <?xml version="1.0" encoding="utf-8" ?>
    <StoredProcedureList>
      <StoredProcedure >
           <uspName> 
             usp_get_gpxx
           </uspName>
           <uspParameters>
            <Name>gpdm</Name>
            <Type>char</Type>
           </uspParameters>
       </StoredProcedure >
          
    </StoredProcedureList>然后用这样的方法访问,但是得不到值:
     XPathDocument xDoc = new XPathDocument("G:/vs/XMLFile1.xml");
                XPathNavigator xpNav;
                xpNav = xDoc.CreateNavigator();
                XPathNodeIterator iterator = xpNav.Select("/StoredProcedureList/StoredProcedure/uspParameters/Name[../../uspName='usp_get_gpxx']");
    得到的iterator 的 current=root,position=0请教各位大侠           
                              
                   
      

  10.   

    如果<uspName>
    usp_get_gpxx
    </uspName>
    改为
    <uspName>usp_get_gpxx</uspName>
    则xpath=
    /StoredProcedureList/StoredProcedure[uspName="usp_get_gpxx"]/uspParameters反之
    xpath=
    /StoredProcedureList/StoredProcedure[uspName="\r\nusp_get_gpxx\r\n"]/uspParameters
      

  11.   

    改成楼上的这种方式了,但得到的结果还是iterator 的 current=root,position=0
      

  12.   

    using System;
    using System.Xml;
    using System.Collections.Generic;
    using System.Xml.XPath;
    using System.IO;
    using System.Text;public class MyClass
    {
        public static void Main()
        {
            try
            {
                string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
    <StoredProcedureList>
    <StoredProcedure >
    <uspName>usp_get_gpxx</uspName>
    <uspParameters>
    <Name>name1</Name>
    </uspParameters>
    <uspParameters>
    <Type>type1</Type>
    </uspParameters>
    <uspParameters>
    <Name>name2</Name>
    <Type>type2</Type>
    </uspParameters>
    </StoredProcedure >
    </StoredProcedureList>";
                Byte[] bytes = Encoding.ASCII.GetBytes(str);
                MemoryStream ms = new MemoryStream();
                ms.Write(bytes,0,bytes.Length);
                ms.Position = 0;
                XPathDocument xDoc = new XPathDocument(ms);
                
                XPathNavigator xpNav = xDoc.CreateNavigator();
                ////uspParameters
                string xpath = String.Format(@"/StoredProcedureList/StoredProcedure[uspName=""{0}""]/uspParameters", "usp_get_gpxx");
                XPathNodeIterator iterator = xpNav.Select(xpath);
                while (iterator.MoveNext()) {
                    
                    Console.WriteLine("uspParameters:{0}",iterator.Current.InnerXml);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            finally
            {
                Console.WriteLine("END");
                Console.Read();
            }
        }
    }
      

  13.   

    运行结果
    =======================================
    uspParameters:<Name>name1</Name>
    uspParameters:<Type>type1</Type>
    uspParameters:<Name>name2</Name>
    <Type>type2</Type>
    END