SQl Xml和C# Xml数据的一点操作总结

103 篇文章 1 订阅
30 篇文章 0 订阅

SQl Xml和C# Xml数据的一点操作总结
在此申明Xml是InfoSet数据不是字符串,所以在此强烈反对用string拼接xml。数据库可以存放xml类型数据,那么该数据的具体操作又如何了。
1.首先建立一张含有xml数据类型的表
CREATE TABLE [dbo].[TestXml](
 [ID] [bigint] IDENTITY(1,1) NOT NULL,
 [Message] [xml] NULL,
 CONSTRAINT [PK_TestXml] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
2.创建相应的DataSet
注意默认Message是String类型,为此我们要把它改为XDocument或则XmlDocument,如:
 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            public XDocument Message {
                get {
                    try {
                        string xmlstr=  ((string)(this[this.tableTestXml.MessageColumn]));
                       return  XDocument.Parse(xmlstr);
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("表“TestXml”中列“Message”的值为 DBNull。", e);
                    }
                }
                set {
                    this[this.tableTestXml.MessageColumn] = value;
                }
            }
3.添加记录
  Database Db = DatabaseFactory.CreateDatabase("TestProvider");
            TestDataSet ds = new TestDataSet();
            DBCommandWrapper dbCommand = Db.GetStoredProcCommandWrapper("TextXml_I");
            XNamespace ns = string.Empty;
            XDocument doc = new XDocument(
                new XElement(ns + "BookStore",
                    new XElement(ns + "Book",
                        new XAttribute("PublicationDate", DateTime.Now.ToShortDateString()),
                        new XAttribute("ISBN", "123-456-7890"),
                        new XElement(ns + "Title", "Asp.Net 2.0 Book"),
                       new XElement(ns + "Price", "12"),
                       new XElement(ns + "Author",
                           new XElement(ns + "First-Name", "ma"),
                           new XElement(ns + "Last-Name", "jiang")
                           )
                           )
                           )
                );

            dbCommand.AddInParameter("Message", DbType.Xml, doc.ToString());
            int result = Db.ExecuteNonQuery(dbCommand);
其中TextXml_I是相应的存储过程CREATE PROC [dbo].[TextXml_I]
(
@Message XML
)
AS
INSERT INTO [TestXml]
           ([Message])
     VALUES
           (@Message)


Database、DatabaseFactory、DBCommandWrapper类是我自己开发的一个框架,详细请看http://blog.csdn.net/dz45693/archive/2010/04/22/5514224.aspx
4.查看数据
相应的html如下
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
    <asp:BoundField HeaderText="ID" DataField="ID" />
    <asp:TemplateField HeaderText="Message">
    <ItemTemplate>
    <asp:Panel runat="server" ID="entryPanel">
        </asp:Panel>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
    </asp:GridView>
由于xml呈现的形式是多变的为此我们用样式来控制其呈现样式,创建XSLMessage.xslt样式文件
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:template match="/BookStore">

    <table>
      <tr>
        <td>
          Title:<xsl:value-of select="Book/Title"/>
        </td>
      </tr>
      <tr>
        <td>
          Price:<xsl:value-of select="Book/Price"/>
        </td>
      </tr>
      <tr>
        <td>
          Author:<xsl:value-of select="Book/Author/First-Name"/>--<xsl:value-of select="Book/Author/Last-Name"/>
        </td>
      </tr>
      <tr>
        <td>
          ISBN:<xsl:value-of select="Book/@ISBN"/>
        </td>
      </tr>
        <tr>
          <td>
            PublicationDate:<xsl:value-of select="Book/@PublicationDate"/>
          </td>
        </tr>
      </table>
  </xsl:template>
</xsl:stylesheet>
查询代码
 Database Db = DatabaseFactory.CreateDatabase("TestProvider");
            TestDataSet ds = new TestDataSet();
            DBCommandWrapper dbCommand = Db.GetSqlStringCommandWrapper("SELECT * FROM dbo.TestXml");
            Db.LoadDataSet(dbCommand, ds, ds.TestXml.TableName);
            this.GridView1.DataSource = ds;
            this.GridView1.DataBind();
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(Server.MapPath("XSLMessage.xslt"));

            for (int i = 0; i < ds.TestXml.Rows.Count; i++)
            {
                GridViewRow row = this.GridView1.Rows[i];
                Panel entryPanel = row.FindControl("entryPanel") as Panel;
                StringWriter sw = new StringWriter();
                xslt.Transform(ds.TestXml[i].Message.GetXmlDocument(), null, sw);
                entryPanel.Controls.Add(new LiteralControl(sw.ToString().Replace("__LINEBREAK__", "<br />")));
            }

注意我在此主张用XDocument,因为它使用很方便;但是很多类还是只支持XmlDocument,为此我们需要一个方法吧XDocument转化为XmDocument,我采用3。5框架的扩展方法方式实现该功能。

 public static class StaticClass
    {

  public static XmlDocument GetXmlDocument(this XDocument doc)
        {
            XmlDocument newdoc = new XmlDocument();
             newdoc.LoadXml(doc.ToString());
             return newdoc;
        }

}
整过查询结果如图:

同样要实现此效果我们还可以依赖xml的查询,请参考http://blog.csdn.net/dz45693/archive/2010/03/30/5434150.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值