我的xml文件是这样的
<?xml version="1.0" encoding="utf-8" ?>
<StoredProcedureList>
<StoredProcedure ID = "usp_get_gpxx">
<Parameters> <Name>gpdm</Name>
<Type>char</Type>
</Parameters> </StoredProcedure >
</StoredProcedureList>
如果用xmltextreade读取其中parameters下的name和type值。谢谢
<?xml version="1.0" encoding="utf-8" ?>
<StoredProcedureList>
<StoredProcedure ID = "usp_get_gpxx">
<Parameters> <Name>gpdm</Name>
<Type>char</Type>
</Parameters> </StoredProcedure >
</StoredProcedureList>
如果用xmltextreade读取其中parameters下的name和type值。谢谢
解决方案 »
- 字典序排序
- 网站使用sqlite to ef求虚拟空间web.config中数据库路径配置方法
- Access数据库存储二进制文件时出错,E_OUTOFMEMORY(0x8007000E)。
- DataGridView显示数据效率
- JavaScript 触发ocx控件事件
- 关于那些点击类网赚的小程序如何实现?
- C# 做服务端和客户端程序怎么样?
- C#有没有象javadoc那样的工具
- Help!救命啊!!!
- WPF MVVM模式 viewmodel之间的通信
- 类型“System.Windows.Forms.Form”未标记为可序列化 错误
- 谁来帮我解释一下,什么是SOA?什么是AJAX?什么是敏捷开发,什么是XP开发?
using System.Xml;
using System.Collections.Generic;public class MyClass
{
public static void Main()
{
try
{
string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<StoredProcedureList>
<StoredProcedure ID = ""usp_get_gpxx"">
<Parameters>
<Name>gpdm</Name>
<Type>char</Type>
</Parameters>
</StoredProcedure >
</StoredProcedureList>";
XmlTextReader xtr = new XmlTextReader(str,XmlNodeType.Element,null);
while (xtr.Read()) {
if (xtr.Name == "Parameters")
{
xtr.Read();
string key = string.Empty;
Dictionary<string, string> result = new Dictionary<string, string>();
while ( xtr.Name != "Parameters")
{
if(XmlNodeType.Element == xtr.NodeType){
key = xtr.Name;
}
else if (XmlNodeType.Text == xtr.NodeType) {
result.Add(key, xtr.Value);
}
xtr.Read();
}
foreach (string k in result.Keys) {
Console.WriteLine("{0}:{1}", k, result[k]);
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Console.WriteLine("END");
Console.Read();
}
}
}只是我不明白为什么一定要用xmltextreader去读?
xd.LoadXml(str);
XmlNode xn = xd.SelectSingleNode("//Parameters");
foreach (XmlNode x in xn.ChildNodes) {
Console.WriteLine("{0}:{1}",x.Name,x.InnerXml);
}
使用xpath来查不是更方便吗
这样写执行到 XmlTextReader xtr = new XmlTextReader(str,XmlNodeType.Element,null);
xtr的值=“\r\n”
是否我的xml文件写得有问题?
我的程序中这样写
XmlDocument xd = new XmlDocument();
xd.LoadXml("G:/vs/XMLFile1.xml");
但是执行到loadxml后会报“data at the root level is invalid,line 1,position 1”
节点类型为空白(whitespace)英文好外是这个
这是正常的
比如
<?xml version=""1.0"" encoding=""utf-8"" ?>
<StoredProcedureList>
<StoredProcedure ID = ""usp_get_gpxx"">
每个element类型的节点之后都有一个"\r\n"的whitespace节点
mlDocument xd = new XmlDocument();
xd.LoadXml("G:/vs/XMLFile1.xml");
这个时候应该使用xd.load而不是loadxml
相关问题可以参考msdn的帮助
再请问,如果xml文件中有多个<StoredProcedure ID = "">
程序中想根据传入的参数找到对应的id如(id="usp_get_gpxx")这个节点的下面的所有<Parameters>
,该怎么办?谢谢
xmlDoc.Load(Server.MapPath("your.xml"));
XmlNode xmlnode = doc.SelectSingleNode(//跟节点//StoredProcedure[@id="5");
if (xmlnode != null)
{
Labe1.text=xmlnode.Attribut.["menuName"].Value.ToString();
Labe2.text=xmlnode.Attribut.["menuName"].Value.ToString();
Labe3.text=xmlnode.Attribut.["menuName"].Value.ToString();
}
using System.Xml;
using System.Collections.Generic;public class MyClass
{
public static void Main()
{
try
{
string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<StoredProcedureList>
<StoredProcedure ID=""usp_get_gpxx"">
<Parameters>
<Name>name1</Name>
</Parameters>
<Parameters>
<Type>type1</Type>
</Parameters>
<Parameters>
<Name>name2</Name>
<Type>type2</Type>
</Parameters>
</StoredProcedure >
</StoredProcedureList>";
XmlDocument xd = new XmlDocument();
xd.LoadXml(str);
string id="usp_get_gpxx";
string xpath = string.Format(@"//StoredProcedure[@ID=""{0}""]/Parameters", id);
XmlNodeList xnl = xd.SelectNodes(xpath);
foreach (XmlNode xn in xnl) {
Console.WriteLine("parameters:");
foreach (XmlNode x in xn)
{
Console.WriteLine("{0}:{1}",x.Name,x.InnerXml);
}
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Console.WriteLine("END");
Console.Read();
}
}
}有关xpath查询可以参见
http://www.w3.org/TR/xpath
中文
http://www.opendl.com/openxml/w3/TR/xpath/xpath-gb.html这儿//StoredProcedure[@ID=""{0}""]/Parameters
表示
// 任意层下
StoredProcedure 名为StoredProcedure的节点
[@ID="usp_get_gpxx"] 并且此节点具有值为usp_get_gpxx的ID属性
/Parameters 再下一层的Parameters节点
<?xml version="1.0" encoding="utf-8" ?>
<StoredProcedureList>
<StoredProcedure >
<uspName>
usp_get_gpxx
</uspName>
<uspParameters>
<Name>gpdm</Name>
<Type>char</Type>
</uspParameters>
</StoredProcedure >
</StoredProcedureList>然后用这样的方法访问,但是得不到值:
XPathDocument xDoc = new XPathDocument("G:/vs/XMLFile1.xml");
XPathNavigator xpNav;
xpNav = xDoc.CreateNavigator();
XPathNodeIterator iterator = xpNav.Select("/StoredProcedureList/StoredProcedure/uspParameters/Name[../../uspName='usp_get_gpxx']");
得到的iterator 的 current=root,position=0请教各位大侠
usp_get_gpxx
</uspName>
改为
<uspName>usp_get_gpxx</uspName>
则xpath=
/StoredProcedureList/StoredProcedure[uspName="usp_get_gpxx"]/uspParameters反之
xpath=
/StoredProcedureList/StoredProcedure[uspName="\r\nusp_get_gpxx\r\n"]/uspParameters
using System.Xml;
using System.Collections.Generic;
using System.Xml.XPath;
using System.IO;
using System.Text;public class MyClass
{
public static void Main()
{
try
{
string str = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<StoredProcedureList>
<StoredProcedure >
<uspName>usp_get_gpxx</uspName>
<uspParameters>
<Name>name1</Name>
</uspParameters>
<uspParameters>
<Type>type1</Type>
</uspParameters>
<uspParameters>
<Name>name2</Name>
<Type>type2</Type>
</uspParameters>
</StoredProcedure >
</StoredProcedureList>";
Byte[] bytes = Encoding.ASCII.GetBytes(str);
MemoryStream ms = new MemoryStream();
ms.Write(bytes,0,bytes.Length);
ms.Position = 0;
XPathDocument xDoc = new XPathDocument(ms);
XPathNavigator xpNav = xDoc.CreateNavigator();
////uspParameters
string xpath = String.Format(@"/StoredProcedureList/StoredProcedure[uspName=""{0}""]/uspParameters", "usp_get_gpxx");
XPathNodeIterator iterator = xpNav.Select(xpath);
while (iterator.MoveNext()) {
Console.WriteLine("uspParameters:{0}",iterator.Current.InnerXml);
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
Console.WriteLine("END");
Console.Read();
}
}
}
=======================================
uspParameters:<Name>name1</Name>
uspParameters:<Type>type1</Type>
uspParameters:<Name>name2</Name>
<Type>type2</Type>
END