Hi Jiang.jiajia:
    我看了你空間的Xml轉DataTable的function后,運用到自己的例子中去。
    
    public void GridviewBind()
    {
        GridView1.DataSource = XmlToDataTable1(@"D:\測試2\Sample.xml", "PO");//參數錯誤
        GridView1.DataBind();
    }    public DataTable XmlToDataTable1(string fileName, string tagName)
    {
        XmlDocument Xmldoc = new XmlDocument();
        Xmldoc.Load(fileName);
        XmlNodeList xlist = Xmldoc.SelectNodes(tagName);//參數錯誤
         //XmlNodeList xlist = doc.SelectNodes("//DataTable/Rows");這一行是你寫的。
        DataTable dt = new DataTable();
        DataRow dr;
        for (int i = 0; i < xlist .Count; i++)
        {
            dr = dt.NewRow();
            XmlElement xe = (XmlElement)xlist.Item(i);
            for (int j = 0; j < xe.Attributes.Count; j++)
            {
                if (!dt.Columns.Contains("@" + xe.Attributes[j].Name))
                {
                    dt.Columns.Add("@" + xe.Attributes[j].Name);
                }
                dr["@" + xe.Attributes[j].Name] = xe.Attributes[j].Value;
            }
            for (int j = 0; j < xe.ChildNodes.Count; j++)
            {
                if (!dt.Columns.Contains(xe.ChildNodes.Item(j).Name))
                {
                    dt.Columns.Add(xe.ChildNodes.Item(j).Name);
                }
                dr[xe.ChildNodes.Item(j).Name] = xe.ChildNodes.Item(j).InnerText;
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }
我的XML是這樣的
  <?xml version="1.0" encoding="UTF-8" ?> 
- <SAPtoSFIS NAME="A">
- <PO>
  <ORDNUM>8718867911</ORDNUM> 
  <ORDDAT>20081117</ORDDAT> 
  <CUSCOO>US</CUSCOO> 
  <CSONUM>533365569</CSONUM> 
  <CUSTPONUM>AREV4546882</CUSTPONUM> 
  <CTOMOD>PLS</CTOMOD> 
+ <PO_LINE>
  <ITMNUM>1</ITMNUM> 
  <TYPE>PLS</TYPE> 
  <COMPAL_PN>JBL0091001M</COMPAL_PN> 
  <CLIMAT>W656C</CLIMAT> 
  <MATDES>Latitude E6400, Intel Core 2 Duo P8400, 2.26GHz,</MATDES> 
  <ORDQTY>1</ORDQTY> 
  <TIEGROUP>1</TIEGROUP> 
  <SI_NUM>337329</SI_NUM> 
- <SUB_ITEM>
  <SUBITM>1</SUBITM> 
  <CLIMAT>FM235</CLIMAT> 
  <TYPE>OTHERS</TYPE> 
  <ITMDES>ASSY,HTSNK,FAN,UMA,R/H</ITMDES> 
  <ORDQTY>1</ORDQTY> 
  <PART_CODE>Y</PART_CODE> 
  </SUB_ITEM>
- <SUB_ITEM>
  <SUBITM>10</SUBITM> 
  <CLIMAT>HY385</CLIMAT> 
  <TYPE>LABEL-COA</TYPE> 
  <ITMDES>LBL,COA,OS,VB32/64,V#2007</ITMDES> 
  <ORDQTY>1</ORDQTY> 
  <PART_CODE>N</PART_CODE> 
  </SUB_ITEM>
- <SUB_ITEM>
  <SUBITM>11</SUBITM> 
  <CLIMAT>KW770</CLIMAT> 
  <TYPE>WLAN</TYPE> 
  <ITMDES>CRD,WRLES,HMCRD,DW1397,4312BG</ITMDES> 
  <ORDQTY>1</ORDQTY> 
  <PART_CODE>Y</PART_CODE> 
  </SUB_ITEM>
  </PO_LINE>
+ <PO_LINE>
  <ITMNUM>2</ITMNUM> 
  <TYPE>2PLS</TYPE> 
  <COMPAL_PN>JBL0081002M</COMPAL_PN> 
  <CLIMAT>2W656C</CLIMAT> 
  <MATDES>Latitude E6400, Intel Core 2 Duo P8400, 2.26GHz,</MATDES> 
  <ORDQTY>21</ORDQTY> 
  <TIEGROUP>21</TIEGROUP> 
  <SI_NUM>337321</SI_NUM> 
- <SUB_ITEM>
  <SUBITM>1</SUBITM> 
  <CLIMAT>FM235</CLIMAT> 
  <TYPE>OTHERS</TYPE> 
  <ITMDES>ASSY,HTSNK,FAN,UMA,R/H</ITMDES> 
  <ORDQTY>1</ORDQTY> 
  <PART_CODE>Y</PART_CODE> 
  </SUB_ITEM>
- <SUB_ITEM>
  <SUBITM>2</SUBITM> 
  <CLIMAT>HY385</CLIMAT> 
  <TYPE>LABEL-COA</TYPE> 
  <ITMDES>LBL,COA,OS,VB32/64,V#2007</ITMDES> 
  <ORDQTY>1</ORDQTY> 
  <PART_CODE>N</PART_CODE> 
  </SUB_ITEM>
  </PO_LINE>
  </PO>
  </SAPtoSFIS>
我對XML一竅不通,請問想此處我的參數tagName(也許叫Path更好)應該是什么?

解决方案 »

  1.   

    似乎是这样的呀
    public static DataTable GetDataTable(string xmlStr)
      

  2.   

    XmlNodeList xlist = doc.SelectNodes("//DataTable/Rows");
    DataTable元素下的所有Rows子元素
      

  3.   


      <?xml version="1.0" encoding="UTF-8" ?> 
    - <SAPtoSFIS NAME="A">
      - <PO>
          <ORDNUM>8718867911</ORDNUM> 
          <ORDDAT>20081117</ORDDAT> 
          <CUSCOO>US</CUSCOO> 
          <CSONUM>533365569</CSONUM> 
          <CUSTPONUM>AREV4546882</CUSTPONUM> 
          <CTOMOD>PLS</CTOMOD> 
        - <PO_LINE>
             <ITMNUM>1</ITMNUM> 
             <TYPE>PLS</TYPE> 
             <COMPAL_PN>JBL0091001M</COMPAL_PN> 
             <CLIMAT>W656C</CLIMAT> 
             <MATDES>Latitude E6400, Intel Core 2 Duo P8400, 2.26GHz,</MATDES> 
             <ORDQTY>1</ORDQTY> 
             <TIEGROUP>1</TIEGROUP> 
             <SI_NUM>337329</SI_NUM> 
           - <SUB_ITEM>
                <SUBITM>1</SUBITM> 
                <CLIMAT>FM235</CLIMAT> 
                <TYPE>OTHERS</TYPE> 
                <ITMDES>ASSY,HTSNK,FAN,UMA,R/H</ITMDES> 
                <ORDQTY>1</ORDQTY> 
                <PART_CODE>Y</PART_CODE> 
             </SUB_ITEM>
           - <SUB_ITEM>
                <SUBITM>10</SUBITM> 
                <CLIMAT>HY385</CLIMAT> 
                <TYPE>LABEL-COA</TYPE> 
                <ITMDES>LBL,COA,OS,VB32/64,V#2007</ITMDES> 
                <ORDQTY>1</ORDQTY> 
                <PART_CODE>N</PART_CODE> 
             </SUB_ITEM>
           - <SUB_ITEM>
                <SUBITM>11</SUBITM> 
                <CLIMAT>KW770</CLIMAT> 
                <TYPE>WLAN</TYPE> 
                <ITMDES>CRD,WRLES,HMCRD,DW1397,4312BG</ITMDES> 
                <ORDQTY>1</ORDQTY> 
                <PART_CODE>Y</PART_CODE> 
             </SUB_ITEM>
          </PO_LINE>
        - <PO_LINE>
             <ITMNUM>2</ITMNUM> 
             <TYPE>2PLS</TYPE> 
             <COMPAL_PN>JBL0081002M</COMPAL_PN> 
             <CLIMAT>2W656C</CLIMAT> 
             <MATDES>Latitude E6400, Intel Core 2 Duo P8400, 2.26GHz,</MATDES> 
             <ORDQTY>21</ORDQTY> 
             <TIEGROUP>21</TIEGROUP> 
             <SI_NUM>337321</SI_NUM> 
           - <SUB_ITEM>
                <SUBITM>1</SUBITM> 
                <CLIMAT>FM235</CLIMAT> 
                <TYPE>OTHERS</TYPE> 
                <ITMDES>ASSY,HTSNK,FAN,UMA,R/H</ITMDES> 
                <ORDQTY>1</ORDQTY> 
                <PART_CODE>Y</PART_CODE> 
             </SUB_ITEM>
           - <SUB_ITEM>
                <SUBITM>2</SUBITM> 
                <CLIMAT>HY385</CLIMAT> 
                <TYPE>LABEL-COA</TYPE> 
                <ITMDES>LBL,COA,OS,VB32/64,V#2007</ITMDES> 
                <ORDQTY>1</ORDQTY> 
                <PART_CODE>N</PART_CODE> 
             </SUB_ITEM>
         </PO_LINE>
       </PO>
     </SAPtoSFIS>
    上面是我的XML,請注意<PO>下面有兩個<PO_LINE>,我現在Gridview綁定出來的table是這個樣子,其他的字段都是OK的,就PO_LINE不OK,字段樣式如下,里面多了很多莫名其妙的亂碼。
     PO_LINE(字段)
     (cell里面的內容為)22PLSJBL0081002M2W656CLatitude E6400, Intel Core 2 Duo P8400, 2.26GHz,21213373211FM235OTHERSASSY,HTSNK,FAN,UMA,R/H 1Y2HY385LABEL-COALBL,COA,OS,VB32/64,V#2007 1N 請問為什么?如何處理?
      

  4.   

    绑定的时候别用eval用例如这样的<%#XPath("FileDesc")%>
      

  5.   

    我前臺沒有eval這樣的東西。
    <div>
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>下班了,明天再來。
      

  6.   

    上面是我的XML,請注意 <PO>下面有兩個 <PO_LINE>,我現在Gridview綁定出來的table是這個樣子,其他的字段都是OK的,就PO_LINE不OK,字段樣式如下,里面多了很多莫名其妙的亂碼。 
    PO_LINE(字段) 
    (cell里面的內容為)22PLSJBL0081002M2W656CLatitude E6400, Intel Core 2 Duo P8400, 2.26GHz,21213373211FM235OTHERSASSY,HTSNK,FAN,UMA,R/H 1Y2HY385LABEL-COALBL,COA,OS,VB32/64,V#2007 1N 請問為什么?如何處理?
    ============================
    我试了一下你的程序.你所谓的乱码其实是每个PO_LINE节点下的SUB_ITEM节点的内容

    11KW770WLANCRD,WRLES,HMCRD,DW1397,4312BG1Y,这是他把sub_item的内容和起来了.你如果读的是PO_LINE节点的内容,即gridview显示两行,分别是两个PO_LINE节点的内容
    而在这个节点下会有一个SUB_ITEM子节点.它会把这个子节点内容和起来输出
      

  7.   

    <%#XPath("FileDesc")%> 绑定前处理文字
      

  8.   

    可能跟你的xml结构有关吧,你的xml嵌套好几层,转到datatable中字段如何对应啊?要转到几个关联的datatable中才行吧。你的问题,可能是在强制转datatable时,把二级以下的xml结构作为数据了吧
      

  9.   

    我的测试代码如下,你运行看一下就知道了
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default19.aspx.cs" Inherits="Default19" %><!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 runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </div>
        </form>
    </body>
    </html>using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Xml;public partial class Default19 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GridviewBind();
        }    public void GridviewBind()
        {
            GridView1.DataSource = XmlToDataTable1(@"D:\po.xml", "//PO/PO_LINE");
            GridView1.DataBind();
        }    public DataTable XmlToDataTable1(string fileName, string tagName)
        {
            XmlDocument Xmldoc = new XmlDocument();
            Xmldoc.Load(fileName);
            XmlNodeList xlist = Xmldoc.SelectNodes(tagName);
            DataTable dt = new DataTable();
            DataRow dr;
            for (int i = 0; i < xlist.Count; i++)
            {
                dr = dt.NewRow();
                XmlElement xe = (XmlElement)xlist.Item(i);
                for (int j = 0; j < xe.Attributes.Count; j++)
                {
                    if (!dt.Columns.Contains("@" + xe.Attributes[j].Name))
                    {
                        dt.Columns.Add("@" + xe.Attributes[j].Name);
                    }
                    dr["@" + xe.Attributes[j].Name] = xe.Attributes[j].Value;
                }
                for (int j = 0; j < xe.ChildNodes.Count; j++)
                {
                    if (!dt.Columns.Contains(xe.ChildNodes.Item(j).Name))
                    {
                        dt.Columns.Add(xe.ChildNodes.Item(j).Name);
                    }
                    dr[xe.ChildNodes.Item(j).Name] = xe.ChildNodes.Item(j).InnerText;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }} 
    你自己对应一下输出的内容(gridview最后一列)和sub_item节点中的内容就明白了.然后再看一下你的xml结构
      

  10.   

    如果你的xpath查询是//PO/PO_LINE(GridView1.DataSource = XmlToDataTable1(@"D:\po.xml", "//PO/PO_LINE");)
    请看下面的xml结构其中ITMNUM,TYPE,COMPAL_PN,CLIMAT,MATDES,ORDQTY,TIEGROUP,SI_NUM这些节点会成为一行记录
    你在转的时候应该对PO_LINE的子节点做处理.或是不显示那些子节点.或是把他们显示成每行记录的子集<PO_LINE>
    <ITMNUM>2</ITMNUM>
    <TYPE>2PLS</TYPE>
    <COMPAL_PN>JBL0081002M</COMPAL_PN>
    <CLIMAT>2W656C</CLIMAT>
    <MATDES>Latitude E6400, Intel Core 2 Duo P8400, 2.26GHz,</MATDES>
    <ORDQTY>21</ORDQTY>
    <TIEGROUP>21</TIEGROUP>
    <SI_NUM>337321</SI_NUM>
    <SUB_ITEM>
    <SUBITM>1</SUBITM>
    <CLIMAT>FM235</CLIMAT>
    <TYPE>OTHERS</TYPE>
    <ITMDES>ASSY,HTSNK,FAN,UMA,R/H</ITMDES>
    <ORDQTY>1</ORDQTY>
    <PART_CODE>Y</PART_CODE>
    </SUB_ITEM>
    <SUB_ITEM>
    <SUBITM>2</SUBITM>
    <CLIMAT>HY385</CLIMAT>
    <TYPE>LABEL-COA</TYPE>
    <ITMDES>LBL,COA,OS,VB32/64,V#2007</ITMDES>
    <ORDQTY>1</ORDQTY>
    <PART_CODE>N</PART_CODE>
    </SUB_ITEM>
    </PO_LINE>
      

  11.   


    好强啊,我也有个关于XML的问题哦,可一帮我解决以下吗,跟着个有点类似的啊,不过我感觉比着个要复杂点啊,就是想写个算是万能的读取XML文件,而不变形吗>?