这个问题花费了我两天的时间来弄 一般接触xml都是一些简单的操作了 当初遇到问题的时候还是从
需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。
这个错误开始了 然后从网上找资料 一点一点积累 用了两天的时间终于将它搞定
前面放网上的资料 因为简单易懂 给需要用到的人一点提示
在内存里建立Xml对象
XmlDocument xml = new XmlDocument(); //建立XmlDomcument对象
XmlDeclaration Declaration = xml.CreateXmlDeclaration("1.0", "utf-8", null); //Xml Declaration(Xml声明)
XmlNode RootNode = xml.CreateNode(XmlNodeType.Element,"v","Games","www-microsoft-game");
xml.AppendChild(RootNode);
XmlNode node1 = xml.CreateNode(XmlNodeType.Element, "v", "Game", "www-microsoft-game");
RootNode.AppendChild(node1);
node1.Attributes.Append(xml.CreateAttribute("name")).InnerText = "文明3";
node1.AppendChild(xml.CreateNode(XmlNodeType.Element,"Price",null)).InnerText = "100";
XmlNode node2 = xml.CreateNode(XmlNodeType.Element, "v", "Game", "www-microsoft-game");
RootNode.AppendChild(node2);
node2.Attributes.Append(xml.CreateAttribute("name")).InnerText = "帝国时代";
node2.AppendChild(xml.CreateNode(XmlNodeType.Element, "Price", null)).InnerText = "300";
xml.InsertBefore(Declaration, xml.DocumentElement);
请注意,如果Xml文档里没有明确指出当前节点的命名空间,那么当前节点的命名空间继承其父节点的命名空间
假设我们刚才生成的Xml文档已存在D:/Xml目录下了,文件的名字就叫sellgame.xml,完整的代码如下代码将生成如下的Xml文档:
<?xml version="1.0" encoding="utf-8" ?>
<v:Games xmlns:v="www-shop-game">
<v:Game name="文明3">
<Price>100</Price>
</Game>
<v:Game name="帝国时代">
<Price>200</Price>
</Game>
</Games>
Xml文档对象下的SelectSingleNode方法。这个方法有两个重载的版本,一个是当Xml文档没有命名空间时使用的,一个参数
SelectSingleNode(string xpath)直接传入xpath即可
另一个是当Xml文档有命名空间时使用的,两个参数
SelelctSingleNode(string xpath,XmlNamespaceManager nsmgr),第一个参数还是xpath,第二个参数是XmlNamespaceManager对象,由于我们的Xml是有命名空间的,所以我们要使用第二种方法!首先我们要建立一个XmlNamespaceManager对象,建立的方法为
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable);
建立完对象后,我们就要开始为nsmgr增加我们的命名空间了(注意,这里加的命名空间要与Xml实际的相对应,但前辍名可不同),增加的方法如下:
nsmgr.AddNamespace("v","www-shop-game")
string price = xml.SelectSingleNode("v:Games/v:Game[@name='文明3']/Price",nsmgr).InnerText
注意,如果Xml文档里没有明确指出当前节点的命名空间,那么当前节点的命名空间继承其父节点的命名空间
假设我们刚才生成的Xml文档已存在D:/Xml目录下了,文件的名字就叫sellgame.xml,完整的代码如下
XmlDocument xml = new XmlDocument();
xml.Load("D://Xml//sellgame.xml")
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable); //建立Xml命名空间管理器对象
nsmgr.AddNamespace("v","www-shop-game"); //增加命名空间
string price = xml.SelectSingleNode("v:Games/v:Game[@name='文明3']/Price",nsmgr).InnerText;//取得相应的节点值
当我们想要取到全部与“文明3”有关的节点时,可以这样:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(new XmlDocument().NameTable); //建立Xml命名空间管理器对象
nsmgr.AddNamespace("v","www-shop-game"); //增加命名空间
XmlNodeList nodeList = xml.SelectNodes("v:Games/v:Game[@name='文明3']/Price",nsmgr); //取得相应的节点数组
如果要取节点的属性值和节点的值时,使用InnerText这个属性。。。。。
上面的代码也没经过测试 不过用来参考的话就足够了
转载自:http://www.glimmer.cn/blog/post/122.html
接下来就是我自己的代码了 同样给有我这样需求的人一点提示
xml文件格式如下:
<responsedata>
<autn:numhits xmlns:autn="http://schemas.autonomy.com/aci/">20</autn:numhits>
<autn:hit xmlns:autn="http://schemas.autonomy.com/aci/">
<autn:reference>v:/20091015/XxjidoC000072_20091015_BJTFN1.xml</autn:reference>
<autn:id>630352</autn:id>
<autn:section>0</autn:section>
<autn:weight>96.00</autn:weight>
<autn:cluster>1</autn:cluster>
<autn:clustertitle>工伤 事故, 上半年, 新加坡</autn:clustertitle>
<autn:database>XINHUA</autn:database>
<autn:title>(国际社会)新加坡今年上半年发生5000多起工伤事故</autn:title>
</autn:hit>
<autn:hit xmlns:autn="http://schemas.autonomy.com/aci/">
<autn:reference>v:/20091015/XxjdzbC000177_20091015_BJTFN1.xml</autn:reference>
<autn:id>630351</autn:id>
<autn:section>0</autn:section>
<autn:weight>96.00</autn:weight>
<autn:cluster>2</autn:cluster>
<autn:clustertitle>博览会, 即日, 奢侈品, 限量</autn:clustertitle>
<autn:database>XINHUA</autn:database>
<autn:title>(服务·消费)世界顶级奢侈品年底南京汇展</autn:title>
</autn:hit>
全部就不都列出来了
我想要的效果就是取出 <autn:title>(服务·消费)世界顶级奢侈品年底南京汇展</autn:title> 的文本了
效果图如下:
xml读取代码如下:
DataTable dt = new DataTable();//新建一个DataTable
dt.Columns.Add("items", System.Type.GetType("System.String"));
xmldoc.Load(Server.MapPath("Hotspot.xml"));//加载xml
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);//命名空间类
nsmgr.AddNamespace("autn", http://schemas.autonomy.com/aci/); //匹配xml的命名空间
foreach (XmlNode node in xmldoc.SelectSingleNode("//*", nsmgr))//获取xml所有内容
{
if (node.Name == "autn:hit" || node.ParentNode.Name == "DOCUMENT")
{
DataRow dr = dt.NewRow();
dr["items"] += node.LastChild.InnerText;
dt.Rows.Add(dr);
}
}
dlhotspot.DataSource = dt;//datalist显示
dlhotspot.DataBind();
xml的添加代码如下:
xmldoc = new XmlDocument();
xmldoc.Load(Server.MapPath("Hotspot.xml"));
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
nsmgr.AddNamespace("autn", "http://schemas.autonomy.com/aci/");
XmlNode RootNode = xmldoc.CreateNode(XmlNodeType.Element, "autn", "hit", nsmgr.LookupNamespace("autn"));
xmldoc.SelectSingleNode("//*", nsmgr).PrependChild(RootNode);
XmlNode nodereference = xmldoc.CreateNode(XmlNodeType.Element, "autn", "reference", nsmgr.LookupNamespace("autn"));
nodereference.InnerText = returnValue;
RootNode.AppendChild(nodereference);
XmlNode nodeid = xmldoc.CreateNode(XmlNodeType.Element, "autn", "id", nsmgr.LookupNamespace("autn"));
nodeid.InnerText = "111111";
RootNode.AppendChild(nodeid);
xml的删除代码如下:
xmldoc = new XmlDocument();
xmldoc.Load(Server.MapPath("Hotspot.xml"));//加载xml
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);//添加命名空间类
nsmgr.AddNamespace("autn", "http://schemas.autonomy.com/aci/");
foreach (XmlNode node in xmldoc.SelectSingleNode("//*", nsmgr))
{
if (node.Name == "autn:hit" || node.ParentNode.Name == "DOCUMENT")
{
if (node.LastChild.InnerText == e.CommandArgument.ToString())
{
node.ParentNode.RemoveChild(node);//要将父级的删除了 不然会留下autn:hit节点
break;
}
}
}