SELECT * FROM parameter pa FOR XML AUTO, ROOT('root')使用以上语句在存储过程中使用FOR XML后输出的XML格式在C# 对象 XmlDocument中载入时就会出错:“有未闭合的字符串”改成以下:SELECT pa.XMLvalue pa.XMLvalue FROM parameter pa FOR XML AUTO, ROOT('root')注明:pa.XMLvalue 类型是XML这时在XmlDocument载入的错误是:"分析 Name 时,出现意外的文件结尾"以上两种错误只是在
XmlReader xr = sq.ExecuteXmlReader(sql);
XPathDocument xd = new XPathDocument(xr);//载入时成错误。
直接在存储过程中“执行存储过程”输出看到的是正确的XML,也只有一个根。如果去掉FOR XML 
SELECT pa.XMLvalue pa.XMLvalue FROM parameter pa
这样在XmlDocument或XPathDocument载入都是正常的,也可以正常使用里面的XML数据,可是我需要多行,所以必须加一个根重新生成。问题就出在FOR XML上,有做过这些项目的高手帮我解决下。谢谢。

解决方案 »

  1.   

    你要确定一个根,FOR XML AUTO,ROOT('root')查询中有root字段么?
    select Cust.CustomerID CustID,CustomerType,SalesOrderID 
    from Sales.Customer Cust  
       join Sales.SalesOrderHeader [order] on Cust.CustomerID=[order].CustomerID  
    order by Cust.CustomerID   
    for XML AUTO,ELEMENTS,ROOT('Orders')  
    /**************<Orders>  
      <Cust>  
        <CustID>1</CustID>  
        <CustomerType>S</CustomerType>  
        <order>  
          <SalesOrderID>43860</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>44501</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>45283</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>46042</SalesOrderID>  
        </order>  
      </Cust>  
      <Cust>  
        <CustID>2</CustID>  
        <CustomerType>S</CustomerType>  
        <order>  
          <SalesOrderID>46976</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>47997</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>49054</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>50216</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>51728</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>57044</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>63198</SalesOrderID>  
        </order>  
        <order>  
          <SalesOrderID>69488</SalesOrderID>  
        </order>  
      </Cust>  
    </Orders>  
    <Orders>
      <Cust>
        <CustID>1</CustID>
        <CustomerType>S</CustomerType>
        <order>
          <SalesOrderID>43860</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>44501</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>45283</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>46042</SalesOrderID>
        </order>
      </Cust>
      <Cust>
        <CustID>2</CustID>
        <CustomerType>S</CustomerType>
        <order>
          <SalesOrderID>46976</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>47997</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>49054</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>50216</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>51728</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>57044</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>63198</SalesOrderID>
        </order>
        <order>
          <SalesOrderID>69488</SalesOrderID>
        </order>
      </Cust>
    </Orders> 
      

  2.   


    select Cust.CustomerID CustID,CustomerType,  
    SalesOrderID from Sales.Customer Cust  
    join Sales.SalesOrderHeader [order]  
    on Cust.CustomerID=[order].CustomerID  
    order by Cust.CustomerID   
    for XML AUTO  
    /************<Cust CustID="1" CustomerType="S">  
      <order SalesOrderID="43860" />  
      <order SalesOrderID="44501" />  
      <order SalesOrderID="45283" />  
      <order SalesOrderID="46042" />  
    </Cust>  
    <Cust CustID="2" CustomerType="S">  
      <order SalesOrderID="46976" />  
      <order SalesOrderID="47997" />  
      <order SalesOrderID="49054" />  
      <order SalesOrderID="50216" />  
      <order SalesOrderID="51728" />  
      <order SalesOrderID="57044" />  
      <order SalesOrderID="63198" />  
      <order SalesOrderID="69488" />  
    </Cust>  
      

  3.   

    我的语法都是正确的,执行存储过程看到的XML也是我想要的,用了FOR XML,ROOT('ROOT')就有了一个根,
    只是这个存储过程装到XmlReader中后,用XmlDocument去解释时就会出错“分析 Name 时,出现意外的文件结尾。 行 1”
    我查了很多相关资了都没找到,如果不用For Xml是可正常的,所以最后确定是For XML生成的XML编码问题。
      

  4.   

    你生成XML的结果中每个属性之间有空格没?例如<ship name= "a "(空格)id= "1 "/>
      

  5.   

    如果有可能的话建议格式化下然后在加载到XmlReader这个里。
      

  6.   


    SELECT * FROM parameter pa FOR XML AUTO, ROOT('root')把查询分析器中的结果贴出来看一下。
      

  7.   

    <root>
      <pr>
        <value>
          <item id="201107221123146562" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703551925" />
            <add key="title_pro" value="asdfadsf" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="88" />
          </item>
        </value>
      </pr>
      <pr>
        <value>
          <item id="201107221646454218" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703551925" />
            <add key="title_pro" value="ssssssss" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="33" />
          </item>
        </value>
      </pr>
      <pr>
        <value>
          <item id="201107221646236093" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703552081" />
            <add key="title_pro" value="dfasdfadfddddd" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="50" />
          </item>
        </value>
      </pr>
      <pr>
        <value>
          <item id="201107221646236093" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703552081" />
            <add key="title_pro" value="dfasdfadfddddd" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="50" />
          </item>
        </value>
      </pr>
      <pr>
        <value>
          <item id="201107221647001562" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703552706" />
            <add key="title_pro" value="sssssss" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="55" />
          </item>
        </value>
      </pr>
      <pr>
        <value>
          <item id="201107221647001562" units="JIA">
            <add key="country" value="US" />
            <add key="key_name" value="JIF" />
            <add key="parameterKey" value="201107111703552706" />
            <add key="title_pro" value="sssssss" />
            <add key="units" value="JIA" />
            <add key="price_sum" value="55" />
          </item>
        </value>
      </pr>
    </root>
    查到的XML是这样的,也是我想要的样子,可是用ExecuteXmlReader存到XmlReader就出错了。
      

  8.   

    用 for xml auto,xtype
    然后不用XMLReader而是用object 接收,转成string 类型,用的时候把编码加上
    <?xml version="1.0" encoding=”GB2312” ?>
      

  9.   

    生成OBJECT应该是可以的,可是我想要的是标准的XML,将来可移动设备也要直接读这XML的。
    现在只想找出FOR XML的问题
      

  10.   

    doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\" ?> " + Xr.ReadOuterXml());有没这么写的这貌似又到了.NET了。
      

  11.   


    谢谢了,
    用其它的字符串转换都是可以的,我用
    SqlDataAdapter adapter = new SqlDataAdapter(command);
    DataSet dataset = new DataSet ();
    adapter.Fill(dataset);
    dataset.GetXml()
    这样也可以获取XML,
    只是我搞不明白,MSDN上说是很明白FOR XML是输出的标准的XML 为什么要转成字符串呢。
    这样的做法就很过于免强的,性能上不佳哦。
      

  12.   


    这样会错误的,ReadOuterXml()报的是同样的错误.就算用ReadOuterString也是错的,搞不明白。
    我去掉FOR XML AUTO,ROOT('root')后就一切都正常了。。
      

  13.   

    这个没有了解过,不是很清楚,如果有必要楼主可以用用sp_makewebtask这个存储过程看看,用for xml auto生成的xml估计没有head标签的问题吧!
      

  14.   

    用object接收用吧!这个应该还可以的。
      

  15.   

    谢谢,给分哈。
    我找出问题了,问题就是XML类型的数据再用FOR XML时会把保存在XML列中的XML格式掉,这账应该算在微软头上。我重做了几次结果出来了。
    比如我在一个列中存的XML数据是<body>主要的</body>
    然后用FOR XML加上根上去 ROOT('root')
    在存储过程中看到的是正确的XML可是再经过XmlReader后不知道为什么把他转义了,成了这样
    <root>
    &lt;body&gt;主要的&lt;body&gt;
    </root>
      

  16.   

    唉,其实他有声明的,只怪我大意。将来有朋友遇到这样的问题看这里。
    http://msdn.microsoft.com/zh-cn/library/ms187082(v=sql.90).aspx
      

  17.   

    他写到:请注意,TYPE 指令将返回 xml 类型作为查询结果。如果未添加 type 指令,则将返回 nvarchar(max) 作为 FOR XML 查询结果。然后,此结果将被转换为 xml 并分配给 xml 类型变量。