<MapInfo>
<!--子隧道信息,提取自FirstPage.aspx-->
<TunnelNode>
<TunnelInfo Name="all">
<Tunnel Name="all">
<!--隧道名称-->
<Name>总隧道</Name>
<!--地图路径-->
<MapUrl>..\FrontImages\gis\map.gif</MapUrl>
<!--隐藏控件值-->
<HiddenThreeValue>1</HiddenThreeValue>
<!--隧道图片长度-->
<ChannelMapWidth>10600</ChannelMapWidth>
<Position>
<!--地图开始位置距离-->
<BEGIN_M>2200</BEGIN_M>
</Position>
</Tunnel>
</TunnelInfo>
<TunnelInfo Name="fey">
<!--隧道名称-->
<Name>佛儿崖</Name>
<Tunnel Name="fey2">
<!--地图路径-->
<MapUrl>..\FrontImages\gis\fey2.gif</MapUrl>
<!--隐藏控件值-->
<HiddenThreeValue>0</HiddenThreeValue>
<!--隧道图片长度-->
<ChannelMapWidth>1680</ChannelMapWidth> <Position>
<!--转换后的设备坐标小于区域实际开始位置像素值-->
<DevicePosLowerActBegin>30</DevicePosLowerActBegin>
<!--转换后的设备坐标在区域实际位置像素值范围内-->
<DeviceBeginPos>200</DeviceBeginPos>
<!--车道指示标志比较值-->
<ConstantDevicePos>40</ConstantDevicePos>
<!--车道指示标志坐标值与区域实际开始像素值运算后小于等于比较值-->
<!--
<DevicePosToAreaBegin>240</DevicePosToAreaBegin>
-->
<!--车道指示标志区域实际结束像素值与设备坐标值运算后小于等于比较值-->
<!--
<AreaEndToDevicePos>160</AreaEndToDevicePos>-->
</Position>
</Tunnel>
<Tunnel Name="fey3">
<MapUrl>..\FrontImages\gis\fey3.gif</MapUrl>
<HiddenThreeValue>1</HiddenThreeValue>
<ChannelMapWidth>1939</ChannelMapWidth>
<Position>
<!--上行隧道开始像素(隧道细节图)-->
<T_ZK_BEGIN_PIXEL>535</T_ZK_BEGIN_PIXEL>
<!--下行隧道开始像素(隧道细节图)-->
<T_YK_BEGIN_PIXEL>300</T_YK_BEGIN_PIXEL>
</Position>
</Tunnel>
</TunnelInfo>
</TunnelNode>
<MapInfo>如上部分XML,我需要得到一个Dictionary<string, DataTable>的结果集,TunnelInfo Name的Value是Key值,一个Key值对应一个表, <TunnelInfo Name="all">的时候表有一行,<TunnelInfo Name="fey">的时候有两行,往下的话行数不固定,目前的效果是
TunnelName Name MapUrl HiddenThreeValue ChannelMapWidth BEGIN_M DevicePosLowerActBegin DeviceBeginPos ConstantDevicePos T_ZK_BEGIN_PIXEL T_YK_BEGIN_PIXEL
all 总隧道 ..\FrontImages\gis\map.gif 1 10600 2200
fey ..\FrontImages\gis\fey3.gif 1 1939 30 200 40 535 300
不会发图。。页面上显示的表内容是这样,丢了一行,想问下怎么判断能动态生成行付下代码:parentNodePath="/MapInfo/TunnelNode";childNodeName="TunnelInfo";Id="Name"; public Dictionary<string, DataTable> GetXmlElementValueToDictionaryDataTable(string parentNodePath, string childNodeName, string Id)
{
Dictionary<string, DataTable> dictXml = new Dictionary<string, DataTable>();
try
{
string xmlpath = MapPath("~/XMLFile1.xml");
XmlDocument doc = new XmlDocument();
doc.Load(xmlpath); XmlNode nodes = doc.SelectSingleNode(parentNodePath);
DataTable dt = new DataTable();
if (nodes != null)
{
for (int i = 0; i < nodes.ChildNodes.Count; i++)
{
XmlNode childNodes = nodes.ChildNodes[i];
if (nodes.ChildNodes[i].Name == childNodeName)
{
if (dt.Rows.Count == 0)
{
dt.Columns.Add(childNodes.ChildNodes[0].Name + Id);
}
for (int j = 0; j < childNodes.ChildNodes.Count; j++)
{
ChildNodesToColumns(childNodes.ChildNodes[j], dt);
}
DataRow dr = dt.NewRow();
dr[nodes.ChildNodes[0].ChildNodes[0].Name + Id] = childNodes.Attributes[Id].Value;
for (int k = 0; k < childNodes.ChildNodes.Count; k++)
{
ChildNodesToRead(childNodes.ChildNodes[k], dr);
}
dt.Rows.Add(dr.ItemArray);
}
dictXml[childNodes.Attributes[Id].Value] = dt;
}
}
return dictXml;
}
catch (Exception ex)
{
return null;
}
} private void ChildNodesToColumns(XmlNode childNodes, DataTable dt)
{
if (childNodes.ChildNodes.Count > 0)
{
for (int i = 0; i < childNodes.ChildNodes.Count; i++)
{
if (!dt.Columns.Contains(childNodes.ChildNodes[i].Name) && childNodes.ChildNodes[i].NodeType != XmlNodeType.Comment && childNodes.ChildNodes[i].ChildNodes.Count == 1)
{
dt.Columns.Add(childNodes.ChildNodes[i].Name);
}
if (!dt.Columns.Contains(childNodes.ChildNodes[i].Name) && childNodes.ChildNodes[i].NodeType != XmlNodeType.Comment && childNodes.ChildNodes[i].ChildNodes.Count > 1)
{
ChildNodesToColumns(childNodes.ChildNodes[i], dt);
}
}
}
} private void ChildNodesToRead(XmlNode childNodes, DataRow dr)
{
try
{
if (childNodes.ChildNodes.Count > 0)
{
for (int i = 0; i < childNodes.ChildNodes.Count; i++)
{
if (childNodes.ChildNodes[i].NodeType != XmlNodeType.Comment && childNodes.ChildNodes[i].ChildNodes.Count == 1)
{
dr[childNodes.ChildNodes[i].Name] = childNodes.ChildNodes[i].InnerText;
}
if (childNodes.ChildNodes[i].NodeType != XmlNodeType.Comment && childNodes.ChildNodes[i].ChildNodes.Count > 1)
{
ChildNodesToRead(childNodes.ChildNodes[i], dr);
}
}
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}或者有能改进的地方也帮小弟提一下,谢谢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货