• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

xml的查找

bin_bin 2004-03-18 06:35:27
我想通过下列语句来读取xml中的数据,
可是foo的值总是为空

//……
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load("d:\\xmlfoo.XML");
System.Xml.XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(xmlDocument.NameTable);
nsmgr.AddNamespace(String.Empty,"http://tempuri.org/SPThemes.xsd");
System.Xml.XmlElement root = xmlDocument.DocumentElement;
System.Xml.XmlNodeList foo = root.SelectNodes (String.Format("//Templates"),nsmgr);
//……


xmlfoo.XML:
<?xml version="1.0" encoding="utf-8" ?>
<SPThemes xmlns="http://tempuri.org/SPThemes.xsd">
<Templates>
<TemplateID>none</TemplateID>
<DisplayName>No Theme(Default)</DisplayName>
<Description>Description</Description>
<Thumbnail>../images/thnone.png</Thumbnail>
<Preview>../images/thnone.gif</Preview>
</Templates>
<Templates>
<TemplateID>aftrnoon</TemplateID>
<DisplayName>Afternoon</DisplayName>
<Description>Description</Description>
<Thumbnail>../images/thanoon.png</Thumbnail>
<Preview>../images/thanoon.gif</Preview>
</Templates>
</SPThemes>
...全文
245 点赞 收藏 31
写回复
31 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bin_bin 2004-03-19
谢谢

发过消息了,可能现在不在吧
回复
2002pine 2004-03-19
你可以问下孟子e章
回复
bin_bin 2004-03-19
这个文件来自微软的sharepoint
真不知道他们是怎么读写这个文件的
回复
bin_bin 2004-03-19
关键就是这个命名空间我不能改啊……
回复
2002pine 2004-03-19
这个问题不知是什么原因,可能是名称空间有点问题,改成这样就可
<SPThemes xmlns:aa="http://tempuri.org/SPThemes.xsd">
回复
showtimenow 2004-03-19
XPath没有错,能不能把命名空间xmlns="http://tempuri.org/SPThemes.xsd"加个前缀,比如xmlns:ss="http://tempuri.org/SPThemes.xsd"
然后在程序里面nsmgr.AddNamespace("ss","http://tempuri.org/SPThemes.xsd");
这样就没问题了

回复
bin_bin 2004-03-19

我基本可以确定不是xpath的问题
因为在没有名空间的情况下是可以运行的
回复
八爪鱼-杭州 2004-03-19
还不行吗,试试这个
string xpath="/Templates";
xd.DocumentElement.SelectNodes(xpath);
回复
showtimenow 2004-03-19
foo.Count为0,说明没有匹配的节点,当然没有用。
刚才贴的程序是有点问题,等一下,我在调试一下
回复
bin_bin 2004-03-19
to CommanSource(CLR)
foo.Count为0啊
遍历有用吗?
回复
bin_bin 2004-03-19
谢谢,诸位的讨论
可是我的问题还没解决

to CommanSource(CLR)
我不认为我的XPath写的有什么问题

问题应该和
<SPThemes xmlns="http://tempuri.org/SPThemes.xsd">
有关

我把名空间去掉就可以得到期望的结果
可是这个名空间我不能去掉……
回复
CommanSource 2004-03-19
foreach (XmlNode isbn in foo){
Console.WriteLine(isbn.Value);
}
回复
CommanSource 2004-03-19
错了哈,SORRY!
System.Xml.XmlNodeList foo = root.SelectNodes (String.Format("//Templates//@TemplateID"),nsmgr);
这样就行了,呵呵!
回复
CommanSource 2004-03-19
晕死,肯定不是?号撒,?是你要列出的属性类,你可以用*来选取所有节点!
回复
bin_bin 2004-03-19
using System;

namespace ConsoleApplication1
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load("d:\\xmlfoo.XML");
System.Xml.XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(xmlDocument.NameTable);
System.Xml.XmlElement root = xmlDocument.DocumentElement;
System.Xml.XmlNodeList foo = root.SelectNodes ("//Templates",nsmgr);
Console.WriteLine(foo.Count);
for(;;);
}
}
}

我期望的结果是2,它的输出是0,不是吗?
回复
showtimenow 2004-03-19
我自己调试成功了阿,怎么你会不成功?

把这句去掉nsmgr.AddNamespace("","http://tempuri.org/SPThemes.xsd")

因为你上面的System.Xml.XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(xmlDocument.NameTable);
已经关联了这个xml文件的命名空间

System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load("d:\\xmlfoo.XML");
System.Xml.XmlNamespaceManager nsmgr = new System.Xml.XmlNamespaceManager(xmlDocument.NameTable);
System.Xml.XmlElement root = xmlDocument.DocumentElement;
System.Xml.XmlNodeList foo = root.SelectNodes ("//Templates",nsmgr);
回复
bin_bin 2004-03-19


在线等待中……
回复
bin_bin 2004-03-19
不能的
"//Templates" 本身也是合法的xpath对吗

SelectNodes("/SPThemes/Templates[TemplateID='aftrnoon']")
----实际调试的代码差不多就是这个:)
回复
八爪鱼-杭州 2004-03-19
那你不去掉使用上面的方法试试
回复
bin_bin 2004-03-19
xml中的名空间去掉是可以的
问题是这个xml不是我写的
我确实是要根据条件来改这个xml
可是我不能改名空间:(

能在不改名空间的情况下做到查找这个xml文件吗?
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-03-18 06:35
社区公告

让您成为最强悍的C#开发者