【问题标题】:This document already has a 'DocumentElement' node -Exception此文档已经有一个“DocumentElement”节点 - 异常
【发布时间】:2011-05-23 10:34:18
【问题描述】:

我在尝试将数据集表中的数据关系转换为 xml 以使 XmlDataSource 将其提供给动态菜单控件时遇到此异常。

这是背后的代码

 DataSet ds = new DataSet();

        SqlCommand cmdmenu = new SqlCommand("select CategoryID,CategoryName from Category ", ConManager.Con());

        SqlCommand com2 = new SqlCommand("select CategoryIDToSub,subcategoryid ,SubCategoryName from CategorySub", ConManager.Con());
        SqlCommand cmd3 = new SqlCommand("select subcategoryid 'SubCategoryID2',Sub2CategoryName from CategorySub2", ConManager.Con());

        SqlDataAdapter menadapter = new SqlDataAdapter(cmdmenu.CommandText, ConManager.Con());
        SqlDataAdapter menadapter2 = new SqlDataAdapter(com2.CommandText, ConManager.Con());
        SqlDataAdapter menadapter3 = new SqlDataAdapter(cmd3.CommandText, ConManager.Con());
        menadapter.Fill(ds, "Menu");

        menadapter.SelectCommand = com2;
        menadapter2.Fill(ds, "SubMenu");
        menadapter3.SelectCommand = cmd3;
        menadapter3.Fill(ds, "SubSubMenu");

        DataColumn colParent =
        ds.Tables["Menu"].Columns["CategoryID"];
        DataColumn colChild =
        ds.Tables["SubMenu"].Columns["CategoryIDToSub"];

        DataRelation relation = new DataRelation("relationName",
        colParent,
        colChild, true);
        DataRelation Relation2 = new DataRelation("relationName2",
        ds.Tables["SubMenu"].Columns["subcategoryid"],
        ds.Tables["SubSubMenu"].Columns["SubCategoryID2"], true);

        relation.Nested = true;
        Relation2.Nested = true;

        ds.Relations.Add(relation);
        ds.Relations.Add(Relation2);

        XmlDataSource.Data = ds.GetXml();

        if (Request.Params["Sel"] != null)
            Page.Controls.Add(new System.Web.UI.LiteralControl("You selected " + Request.Params["Sel"]));

这是 Xslt 文件代码

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="utf-8"/>


  <!-- Replace root node name Menus with MenuItems
       and call MenuListing for its children-->
  <xsl:template match="/Menus">
    <MenuItems>
      <xsl:call-template name="MenuListing" />
    </MenuItems>
  </xsl:template>

  <!-- Allow for recursive child nodeprocessing -->
  <xsl:template name="MenuListing">
    <xsl:apply-templates select="Menu" />
  </xsl:template>

  <xsl:template match="Menu">
    <MenuItem>
      <!-- Convert Menu child elements to MenuItem attributes -->
      <xsl:attribute name="Text">
        <xsl:value-of select="CategoryName"/>
      </xsl:attribute>
      <xsl:attribute name="ToolTip">
        <xsl:value-of select="Remarks"/>
      </xsl:attribute>
      <xsl:attribute name="NavigateUrl">
        <xsl:text>?Sel=</xsl:text>
        <xsl:value-of select="Text"/>
      </xsl:attribute>
      <xsl:attribute name="Text2">
        <xsl:value-of select="SubCategoryName"/>
      </xsl:attribute>
      <xsl:attribute name="Test3">
        <xsl:value-of select="Sub2CategoryName3"/>
      </xsl:attribute>
      <!-- Recursively call MenuListing forchild menu nodes -->
      <xsl:if test="count(Menu) >0">
        <xsl:call-template name="MenuListing" />
      </xsl:if>
    </MenuItem>
  </xsl:template>
</xsl:stylesheet>

这是菜单控件和 XmlDataSource 代码

<asp:Menu ID="Menu" runat="server" BackColor="#E3EAEB"   DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#666666" StaticSubMenuIndent="10px" DataSourceID="XmlDataSource" Width="225px" onmenuitemclick="Menu_MenuItemClick">

<DataBindings>
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text" />
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text2" />
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl" TextField="Text3" />
</DataBindings>

            <StaticSelectedStyle BackColor="#1C5E55" />
            <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
            <DynamicHoverStyle BackColor="#666666" ForeColor="White" />
            <DynamicMenuStyle BackColor="#E3EAEB" />
            <DynamicSelectedStyle BackColor="#1C5E55" />
            <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
            <StaticHoverStyle BackColor="#666666" ForeColor="White" />
      </asp:Menu>                       
      <asp:XmlDataSource ID="XmlDataSource" runat="server"
            TransformFile="~/TransformXSLT.xsl" XPath="MenuItems/MenuItem">
      </asp:XmlDataSource>

【问题讨论】:

    标签: c# xml dynamic ado.net xslt


    【解决方案1】:

    您的 XML 文档格式不正确。您有多个文档(根)元素。例如:

    <a>some</a>
    <a>thing</a>
    

    格式正确。鉴于:

    <list>
      <a>some</a>
      <a>thing</a>
    </list>
    

    结构良好。

    【讨论】:

    • 你好 :) 但输出 Xml 不包含多个文档 Root ,所以有什么问题:( ???
    • 你能提供堆栈跟踪吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多