none
出现“此文档已具有‘DocumentElement’节点”提示如何解决?谢谢~ RRS feed

  • 问题

  • 测试代码如下:
    <%@ Page Language="C#" ValidateRequest="false" Debug="true" %>

    <%@ Import Namespace="System.Data" %>

    <%@ Import Namespace="System.Data.SqlClient" %>

    <%@ Import Namespace="System.Data.Sql" %>

    <%@ Import Namespace="System.Xml" %>

    <%@ Import Namespace="System.Web.Configuration" %>

    <%@ Import Namespace="System.Data.SqlTypes" %>

    <script runat="server">

        void Page_Load(object sender, EventArgs e)

        {

            SqlConnection conn = new SqlConnection();

            conn.ConnectionString = "server=localhost;database=yhy;Integrated Security=true;";

            try

            {

                conn.Open();

                SqlCommand cmd = conn.CreateCommand();

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = "RES_Classroom_byClassroomID";

               

                XmlDocument RES_ClassroomDoc = new XmlDocument();

                XmlReader reader = cmd.ExecuteXmlReader();

                while (reader.Read())

                {

                    Response.ContentType = "text/xml";

                    RES_ClassroomDoc.PreserveWhitespace = true;

                    RES_ClassroomDoc.Load(reader);

                }

                Response.ClearContent();

                Response.Write(RES_ClassroomDoc.InnerXml);

                Response.End();

               

            }

            catch (XmlException xmlEx)

            {

                Response.Write("XmlException: " + xmlEx.Message);

            }

            finally

            {

                conn.Close();

            }

        }



    </script>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head id="Head1" runat="server">

        <title>DataReaderTestWeb</title>

    </head>

    <body>

        <form id="form1" runat="server">

        <div>

        </div>

        </form>

    </body>

    </html>


        在浏览器中查看,结果出现如下错误!绝对新手,以上全是自己写的,估计错误多多,不知怎么解决?希望高手帮看下,谢谢~
    注:本测试想最终在浏览器中得到类似如下样式,

      <?xml version="1.0" ?> 
    
    - <!--  This file represents a fragment of a book store inventory database 
    
      --> 
    
    - <bookstore>
    
    - <book genre="autobiography">
    
      <title>The Autobiography of Benjamin Franklin</title> 
    
    - <author>
    
      <first-name>Benjamin</first-name> 
    
      <last-name>Franklin</last-name> 
    
      </author>
    
      <price>8.99</price> 
    
      </book>
    
    - <book genre="novel">
    
      <title>The Confidence Man</title> 
    
    - <author>
    
      <first-name>Herman</first-name> 
    
      <last-name>Melville</last-name> 
    
      </author>
    
      <price>11.99</price> 
    
      </book>
    
    - <book genre="philosophy">
    
      <title>The Gorgias</title> 
    
    - <author>
    
      <name>Plato</name> 
    
      </author>
    
      <price>9.99</price> 
    
      </book>
    
      </bookstore>
    
    
    2009年3月31日 8:53

答案

  • 出现错误是因为没有根节点,你可以这样修改
    
    try
    {
      conn.Open();
      SqlCommand cmd = conn.CreateCommand();
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = "RES_Classroom_byClassroomID";
      XmlDocument RES_ClassroomDoc = new XmlDocument();
      System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
      StringBuilder sp = new StringBuilder();
      sp.Append("<root>");
      while (dr.Read())
      {        
        sp.Append(dr.GetValue(0));
      
      }
      sp.Append("</root>");
      RES_ClassroomDoc.LoadXml(sp.ToString());
      Response.ContentType = "text/xml";
      Response.ClearContent();
      Response.Write(RES_ClassroomDoc.InnerXml);
      Response.End();
    }       
    catch (XmlException xmlEx)
    {
      Response.Write("XmlException: " + xmlEx.Message);
    }
    finally
    {
      conn.Close();
    }

    孟宪会
    2009年4月1日 8:20
    版主
  • 也 可以这样

    try
    {
      conn.Open();
      SqlCommand cmd = conn.CreateCommand();
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = "RES_Classroom_byClassroomID";
      XmlDocument RES_ClassroomDoc = new XmlDocument();
      XmlReader reader = cmd.ExecuteXmlReader();
      XmlElement root = RES_ClassroomDoc.CreateElement("Root");
      RES_ClassroomDoc.AppendChild(root);
      XmlNode node = RES_ClassroomDoc.ReadNode(reader);
      while (node != null)
      {
        root.AppendChild(node);
        node = RES_ClassroomDoc.ReadNode(reader);
      }      
      Response.ContentType = "text/xml";
      Response.ClearContent();
      Response.Write(RES_ClassroomDoc.InnerXml);
      Response.End();
    }
    catch (XmlException xmlEx)
    {
      Response.Write("XmlException: " + xmlEx.Message);
    }
    finally
    {
      conn.Close();
    }

    孟宪会
    2009年4月1日 8:42
    版主

全部回复

  • 好像是没有根节点,你这样试试

    Response.ClearContent();
    Response.Write("<root>");
    Response.Write(RES_ClassroomDoc.InnerXml);
    Response.Write("</root>");
    Response.End();

    另外先以html打开RES_ClassroomDoc的内容看看是什么内容。
    孟宪会
    2009年3月31日 9:33
    版主
  • 孟老师,试了试,可错误依旧!
    2009年3月31日 9:38
  • 报告哪行错误?
    另外,下面的xml是取出来的内容吗
    孟宪会
    2009年3月31日 9:43
    版主
  • 是sql语句里面的问题,这么写存储过程


    "SELECT * FROM products FOR XML AUTO";

    孟宪会
    2009年3月31日 9:48
    版主
  • 参考 http://msdn.microsoft.com/zh-cn/library/aa902660(en-us,SQL.80).aspx

    http://www.richnetapps.com/converting_xmlreader_to_xmldocument_in_n/
    孟宪会
    2009年3月31日 9:51
    版主
  • 哦!下面的xml不是本测试中的,我只是举了个例子而已。
    存储过程如下:
    ALTER PROCEDURE [dbo].[RES_Classroom_byClassroomID]

    AS

     SELECT * From RES_Classroom 
        order by ClassroomID
        FOR XML AUTO, ELEMENTS

    2009年3月31日 10:05
  • 还是有些参不透!
    2009年3月31日 14:56
  •    while (reader.Read())

                {

                    Response.ContentType = "text/xml";

                    RES_ClassroomDoc.PreserveWhitespace = true;

                    RES_ClassroomDoc.Load(reader);

                }

    xmlreader不用这个循环吧  你这个用法是sqlreader用的  xmlreader只需要read一次  否则按照你这个用法  xmlreader每移动一个节点就会load一次吧


    把这个循环直接替换成


      RES_ClassroomDoc.Load(reader);

               

    实验下  也许就过了


    热烈庆祝进入4星活跃用户队伍
    有原则的回答问题: 不懂的不去装懂,别人回答得很完整的,没有需要补充的不去蹭分。
    2009年4月1日 1:51
  • 试了试!老问题依旧,堆栈跟踪:

    [InvalidOperationException: 此文档已具有“DocumentElement”节点。]
       System.Xml.XmlDocument.IsValidChildType(XmlNodeType type) +203
       System.Xml.XmlDocument.AppendChildForLoad(XmlNode newChild, XmlDocument doc) +25
       System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) +20
       System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) +278
       System.Xml.XmlDocument.Load(XmlReader reader) +97
       ASP.default4_aspx.Page_Load(Object sender, EventArgs e) in d:\My Documents\Visual Studio 2005\Projects\TestWeb\Default4.aspx:29
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +13
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +45
       System.Web.UI.Control.OnLoad(EventArgs e) +80
       System.Web.UI.Control.LoadRecursive() +49
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3750
    
    2009年4月1日 7:34
  • 出现错误是因为没有根节点,你可以这样修改
    
    try
    {
      conn.Open();
      SqlCommand cmd = conn.CreateCommand();
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = "RES_Classroom_byClassroomID";
      XmlDocument RES_ClassroomDoc = new XmlDocument();
      System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
      StringBuilder sp = new StringBuilder();
      sp.Append("<root>");
      while (dr.Read())
      {        
        sp.Append(dr.GetValue(0));
      
      }
      sp.Append("</root>");
      RES_ClassroomDoc.LoadXml(sp.ToString());
      Response.ContentType = "text/xml";
      Response.ClearContent();
      Response.Write(RES_ClassroomDoc.InnerXml);
      Response.End();
    }       
    catch (XmlException xmlEx)
    {
      Response.Write("XmlException: " + xmlEx.Message);
    }
    finally
    {
      conn.Close();
    }

    孟宪会
    2009年4月1日 8:20
    版主
  • 也 可以这样

    try
    {
      conn.Open();
      SqlCommand cmd = conn.CreateCommand();
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.CommandText = "RES_Classroom_byClassroomID";
      XmlDocument RES_ClassroomDoc = new XmlDocument();
      XmlReader reader = cmd.ExecuteXmlReader();
      XmlElement root = RES_ClassroomDoc.CreateElement("Root");
      RES_ClassroomDoc.AppendChild(root);
      XmlNode node = RES_ClassroomDoc.ReadNode(reader);
      while (node != null)
      {
        root.AppendChild(node);
        node = RES_ClassroomDoc.ReadNode(reader);
      }      
      Response.ContentType = "text/xml";
      Response.ClearContent();
      Response.Write(RES_ClassroomDoc.InnerXml);
      Response.End();
    }
    catch (XmlException xmlEx)
    {
      Response.Write("XmlException: " + xmlEx.Message);
    }
    finally
    {
      conn.Close();
    }

    孟宪会
    2009年4月1日 8:42
    版主
  • 已解决!谢谢孟老师~记下此问题原因了,继续学习~
    2009年4月1日 9:18