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更好)應該是什么?
我看了你空間的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更好)應該是什么?
解决方案 »
- net多语言支持实现
- 为啥我的XP系统装IIS5.1发布网站老报没权限?
- asp.net 分页
- 推荐 申请免费静态域名空间 网站 ?
- 用户控件里可以使用ajax吗?
- 【请教】怎么样把数据库中的数据以XML形式输出?(VB版 顶者有分)
- 关于 EXCEL导出报错的问题, 我用VS2005测试都没问题 架到服务器上就报错 请进
- 页面部署两个file控件,上传图像的可以,上传rar文件没有反映~后台代码基本一致?原因是什么?
- 如何在客户端脚本中判断treeview的当前选中结点是否有下级结点
- nhibernate one-to-many 问题
- 怎么asp.net制作留言板?
- Web中:如何在字符串中取得指定像素宽度的字符?
public static DataTable GetDataTable(string xmlStr)
DataTable元素下的所有Rows子元素
<?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 請問為什么?如何處理?
<div>
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>下班了,明天再來。
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子节点.它会把这个子节点内容和起来输出
<%@ 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结构
请看下面的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>
好强啊,我也有个关于XML的问题哦,可一帮我解决以下吗,跟着个有点类似的啊,不过我感觉比着个要复杂点啊,就是想写个算是万能的读取XML文件,而不变形吗>?