XML如下:
<Report>
  <ReportParameters>
    <ReportParameter Name="SQLConnectionString">
      <DataType>String</DataType>
      <Nullable>true</Nullable>
      <AllowBlank>true</AllowBlank>
      <Prompt>Sql Connection String</Prompt>
      <Hidden>true</Hidden>
    </ReportParameter>
    <ReportParameter Name="Type">
      <AllowBlank>true</AllowBlank>
      <Prompt>Accounting Run Type</Prompt>
      <ValidValues>
        <ParameterValues>
          <ParameterValue>
            <Value>ClosedPeriod</Value>
          </ParameterValue>
          <ParameterValue>
            <Value>Books</Value>
          </ParameterValue>
        </ParameterValues>
      </ValidValues>
    </ReportParameter>
  <ReportParameters>
<Report>我想找到<ReportParameter Name="Type">下面的<Value>Books</Value>,我的想法是:
/rpt:Report/rpt:ReportParameters/rpt:ReportParameter[@Name="Type"]/rpt:ValidValues/rpt:ParameterValues/rpt:ParameterValue[Value="Books"]可是这样查不到结果.哪位大侠能帮帮忙?

解决方案 »

  1.   

    下面是我查SingleNode的一段程序:
    XmlDocument doc = new XmlDocument();
                doc.Load(xmlFile);
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("rpt", _NameSpace);
                XmlNodeList nodes = doc.SelectNodes(xPath, nsmgr);
                if (nodes != null && nodes.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
      

  2.   

      XmlNodeList _List = _Document.SelectNodes("Report/ReportParameters/ReportParameter[@Name='Type']/ValidValues/ParameterValues/ParameterValue/Value[.='Books ']");
      

  3.   


    string xml = @"<Report> 
      <ReportParameters> 
        <ReportParameter Name='SQLConnectionString'> 
          <DataType>String </DataType> 
          <Nullable>true </Nullable> 
          <AllowBlank>true </AllowBlank> 
          <Prompt>Sql Connection String </Prompt> 
          <Hidden>true </Hidden> 
        </ReportParameter> 
        <ReportParameter Name='Type'> 
          <AllowBlank>true </AllowBlank> 
          <Prompt>Accounting Run Type </Prompt> 
          <ValidValues> 
            <ParameterValues> 
              <ParameterValue> 
                <Value>ClosedPeriod </Value> 
              </ParameterValue> 
              <ParameterValue> 
                <Value>Books</Value> 
              </ParameterValue> 
            </ParameterValues> 
          </ValidValues> 
        </ReportParameter> 
      </ReportParameters> 
    </Report> 
    ";            XmlDocument xmld = new XmlDocument();
                xmld.LoadXml(xml);
                XmlNode node = xmld.SelectSingleNode(@".//ReportParameter[@Name='Type']/ValidValues/ParameterValues/ParameterValue[Value='Books']/Value");
      

  4.   

    看看你的<Value>Books </Value> 
    还有 </ReportParameter> 
      <ReportParameters> 
    <Report> 
    xml都是错的,Value节点Books有空格
      

  5.   

    3楼的zgke的写法没有问题..下面是测试代码..就是你要取到的东西..
     string xml=@"<Report><ReportParameters><ReportParameter Name=""SQLConnectionString""><DataType>String </DataType><Nullable>true </Nullable><AllowBlank>true </AllowBlank><Prompt>Sql Connection String </Prompt><Hidden>true </Hidden></ReportParameter><ReportParameter Name=""Type""><AllowBlank>true </AllowBlank><Prompt>Accounting Run Type </Prompt><ValidValues><ParameterValues><ParameterValue><Value>ClosedPeriod </Value></ParameterValue><ParameterValue><Value>Books </Value></ParameterValue></ParameterValues></ValidValues></ReportParameter></ReportParameters></Report>";
                XmlDocument xDoc = new XmlDocument();
                xDoc.LoadXml(xml);
                XmlNodeList _List = xDoc.SelectNodes("Report/ReportParameters/ReportParameter[@Name='Type']/ValidValues/ParameterValues/ParameterValue/Value[.='Books ']");
                string strValue = _List[0].OuterXml;//取到的就是<Value>Books </Value>
      

  6.   

    对..你的XML中有空格..
    所以zgke才写成:/Value[.='Books ']..看到了吗..Books后面有空格..和你的XML中一样..
      

  7.   

     <ReportParameters> 
    <Report> 没有/这个,上面的xpath应该都可以的,自己测试一下
      

  8.   

    你不要加nsmgr.AddNamespace("rpt", _NameSpace); 
    你不要加命名空间,因为你xml本身没有命名空间
      

  9.   

    /rpt:Report/rpt:ReportParameters/rpt:ReportParameter[@Name='Type']/rpt:ValidValues/rpt:ParameterValues/rpt:ParameterValue/rpt:Value我取到这一层的时候还是能取到正确结果的
      

  10.   


    sorry,我XMl里面有命名空间,在帖子里面的是为了让大家看着方便临时去掉的
      

  11.   

    我估计是是你有命名空间,估计后面的xpath有问题,贴个完整的给你试试
      

  12.   

    用下面的就可以了.../rpt:Report/rpt:ReportParameters/rpt:ReportParameter[@Name='AccountingRunType']/rpt:ValidValues/rpt:ParameterValues/rpt:ParameterValue/rpt:Value[text()='Books']
      

  13.   

    为什么呢?是不是Books这值那取出来了什么特别的东西?
      

  14.   

    恩,你在试试这样行不/rpt:Report/rpt:ReportParameters/rpt:ReportParameter[@Name='AccountingRunType']/rpt:ValidValues/rpt:ParameterValues/rpt:ParameterValue[rpt:Value='Books']/rpt:Value
      

  15.   

    用这么长XPATH 楼主还是蛮有水平的... 学习+UP