XDocument无法正确读取带有不应有 xml xmlnss的xml,怎么做

XDocument无法正确读取带有xmlns的xml,如何做?
40kingliang123]
发布时间: 18:35:34
编辑:www.fx114.net
本篇文章主要介绍了"XDocument无法正确读取带有xmlns的xml,如何做?
40kingliang123]",主要涉及到XDocument无法正确读取带有xmlns的xml,如何做?
40kingliang123]方面的内容,对于XDocument无法正确读取带有xmlns的xml,如何做?
40kingliang123]感兴趣的同学可以参考一下。
在silverlight的xml读取,只能用linq&to&xml,
而我的xml的要结点,
&Parameters&xmlns:i="http://www.w3.org/2001/XMLSchema-instance"&xmlns="http://schemas.openxmlformats.org/officeDocument/2011/Soul/Parameters"&
&ParameterItem&&ParameterDataType&String&/ParameterDataType&&ParameterDefaultValue&3&/ParameterDefaultValue&&ParameterDesc&编号&/ParameterDesc&&ParameterDirection&I/O&/ParameterDirection&&ParameterID&a88491f6-ada3-40a5-bce2-a&/ParameterID&&ParameterName&编号&/ParameterName&&/ParameterItem&&/Parameters&
带有xmlns信息,结果用linq&时,不能正确读取。但如果带那些xmlns信息去掉,是可以正常读取的。
我的linq&是这样用的。
var&projects&=&from&f&in&xdoc.Descendants("ParameterItem")
&&&&&&&&&&&&&&&&&&&&&&&&&&&select&new&TableField
&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterDataType&=&f.Element("ParameterDataType").Value,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterDefaultValue&=&f.Element("ParameterDefaultValue").Value,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterDesc&=&f.Element("ParameterDesc").Value,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterDirection&=&f.Element("ParameterDirection").Value,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterID&=&f.Element("ParameterID").Value,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ParameterName&=&f.Element("ParameterName").Value
&&&&&&&&&&&&&&&&&&&&&&&&&&&&};你可以尝试使用XmlReader读取Xml文件,不一定必须Linq&to&xml,参考以下文章,可以下载源码看看。
/chengxingliang/archive//1949579.html
本文标题:
本页链接:I try to query elements from an visual studio *.csproj file. I created a short example to illustrate the problem:
// Working
string xml1 = @"&Project ToolsVersion='4.0'&
&ItemGroup Label='Usings'&
&Reference Include='System' /&
&Reference Include='System.Xml' /&
&/ItemGroup&
&/Project&";
// Not working
string xml2 = @"&Project ToolsVersion='4.0' xmlns='/developer/msbuild/2003'&
&ItemGroup Label='Usings'&
&Reference Include='System' /&
&Reference Include='System.Xml' /&
&/ItemGroup&
&/Project&";
XDocument doc = XDocument.Parse(xml2);
foreach (XElement element in doc.Descendants("ItemGroup"))
Console.WriteLine(element);
The string xml1 works fine, xml2 doesn't return anything. The only difference between those strings is xmlns attribute in the document root.
How do i query documents containing xmlns attributes?
Why is it a problem when a xml document contains an xmlns attribute?
Why is it a problem when a xml document contains an xmlns attribute?
It's not, if you understand what it means :) Basically you've applied a default namespace URI of "" to all elements. So when querying, you need to specify that namespace too. Fortunately, LINQ to XML makes that really simple:
XNamespace ns = "/developer/msbuild/2003";
XDocument doc = XDocument.Parse(xml2);
foreach (XElement element in doc.Descendants(ns + "ItemGroup"))
Console.WriteLine(element);
本文地址: &
我尝试查询从视觉工作室* .csproj的文件元素。我创建了一个简单的例子来说明这个问题:
//工作串XML1 = @“<项目ToolsVersion ='4.0'> <的ItemGroup标签='Usings'> &参考包括='系统'/> &参考包括='的System.Xml'/ > < /&的ItemGroup GT; < /项目&“中;
//不工作串XML2 = @“<项目ToolsVersion ='4.0'的xmlns =”HTTP:///developer/msbuild/2003'&
<的ItemGroup标签='Usings'> &参考包括='系统'/> &参考包括='的System.Xml'/> < /的ItemGroup&GT ; < /项目&“中;
的XDocument DOC = XDocument.Parse(XML2);
{ Console.WriteLine(元)(以doc.Descendants(“的ItemGroup”)的XElement元); }
XML1工作正常的字符串,XML2不返回任何东西。这些字符串之间的唯一区别是在文档根xmlns属性。
我如何查询包含的xmlns属性的文件? 当XML文档包含xmlns属性为什么是一个问题?
当一个XML文档包含xmlns属性为什么是一个问题?
这不,如果你明白是什么意思:)基本上你'已经应用了的默认的命名空间的““的所有元素。因此查询时,你需要指定过该命名空间。幸运的是,LINQ到XML使这很简单:
的XNamespace NS =“/developer/的MSBuild / 2003“; 的XDocument DOC = XDocument.Parse(XML2); 的foreach
{ Console.WriteLine(元)(以doc.Descendants(NS +“的ItemGroup”)的XElement元); }
本文地址: &
扫一扫关注官方微信3832人阅读
最近碰到一个小问题,通过调用webservice返回如下的xml,
&Seller xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:xsd=&http://www.w3.org/2001/XMLSchema&&
& &id xmlns=&/&&348388&/id&
& &gender xmlns=&/&&Monsieur&/gender&
& &lastName xmlns=&/&&FABRIZZI&/lastName&
& &firstName xmlns=&/&&FRANCIS&/firstName&
& &login xmlns=&/&&francis.fabrizzi@bayern-aix.net.bmw.fr&/login&
& &password xmlns=&/&&KUVOTFP&/password&
& &profile xmlns=&/&&Chef de vente&/profile&
& &email xmlns=&/&&francis.fabrizzi@bayern-aix.net.bmw.fr&/email&
& &mobilePhone xmlns=&/&&&/mobilePhone&
& &dateRec xmlns=&/&&T22:49:49.283&/dateRec&
& &dateMod xmlns=&/&&T22:49:49.283&/dateMod&
& &idDrv xmlns=&/&&233734&/idDrv&
& &drv xmlns=&/&&DAVID ROUSSEAU&/drv&
& &idCrv xmlns=&/&&233775&/idCrv&
& &crv xmlns=&/&&ALEXANDRA CORDIER&/crv&
& &idCdv xmlns=&/&&0&/idCdv&
& &dealerCode xmlns=&/&&FB001&/dealerCode&
& &dealerType xmlns=&/&&Premium&/dealerType&
& &dealerQualification xmlns=&/&&GOLD&/dealerQualification&
& &dealerName xmlns=&/&&BAYERN AIX&/dealerName&
& &dealerAddress xmlns=&/&&ZA La Pioline&/dealerAddress&
& &dealerZipCode xmlns=&/&&13546&/dealerZipCode&
& &dealerCity xmlns=&/&&AIX EN PROVENCE&/dealerCity&
& &dealerPhone1 xmlns=&/&&&/dealerPhone1&
& &dealerPhone2 xmlns=&/&&&/dealerPhone2&
& &dealerSellChannel xmlns=&/&&CCP BMW Mini&/dealerSellChannel&
当时也没有多想,直接用xpath解析了,没想到死活不成功,再仔细一看,原来有命名空间,真是头大。
然后去google找答案,如下部分转自帖子。
众所周知,XmlDocument可以进行XPath查询,但实际上这里所说的XPath查询仅限于没有命名空间(没有xmlns属性)的XML,一旦遇到有命名空间的XML,对应XPath查询都会无结果。
比如下面这个XML
&a&xmlns=&&&
&&&&&b&ccc&/b&
XPath查询/a/b会返回null,而如果没有xmlns的话,会返回节点b。
为什么会这样呢?MSDN的相应函数有解释(参考:)
If the XPath expression does not include a prefix, it is assumed that the namespace URI is the empty namespace. If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceM otherwise,
you will not get any nodes selected
意思就是如果XPath表达式没有加前缀(如a:b中前缀是a),那么所查询节点(注意属性也可以是节点)的命名空间URI就应该是空值(也是默认值),否则XPath不会返回结果。
上面的XML, 因为节点a和b都有命名空间值,自然XPath查询不会有结果。
(上面英文还提到如果节点有默认命名空间,那么还得手动向XmlNamespaceManager添加前缀和命名空间值,这个在后面会讲的)
在看解决方案前,首先需要能够辨识XML命名空间,当然辨识XML命名空间值还是很容易的,参考如下XML(这个XML在后面程序中也会用到)
&?xml&version=&1.0&&encoding=&utf-8&?&
&root&xmlns=&dotnet&&xmlns:w=&wpf&&
in a&/a&&&&&&&&&&&&&&&&&
&&&w:b&data
in b&/w:b&&&&&&&&&&
&&&c&xmlns=&silverlight&&
&&&&&w:d&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&e&data
in e&/e&&&&&&&&&&&&&&&
&&&&&/w:d&
它的所有XML节点的命名空间如下所示:
&?xml&version=&1.0&&encoding=&utf-8&?&
&root&xmlns=&dotnet&&xmlns:w=&wpf&&
&&&!--&xmlns:
dotnet&--&
&&&!--&xmlns:
dotnet&--&
&&&w:b&data
in b&/w:b&
&&&!--&xmlns:
&&&c&xmlns=&silverlight&&
&&&&&!--&xmlns:
silverlight&--&
&&&&&&&!--&xmlns:
&&&&&&&e&data
&&&&&&&!--&xmlns:
silverlight&--&
&&&&&/w:d&
如果识别XML命名空间没有问题,那么后面的操作就相当简单了,你需要记住:在XmlDocument中用XPath查询某一节点时,只要它的命名空间值不是空值,那么你必须给它一个前缀,用这个前缀代表这个节点的命名空间值!这些前缀是通过XmlNamespaceManager类添加的,使用时将XmlNamespaceManager传入SelectNodes或SelectSingleNode中即可。这也是为什么上面说“如果节点有默认命名空间,那么还得手动向XmlNamespaceManager添加前缀和命名空间值”的原因。
另外构造一个XmlNamespaceManager需要XmlNameTable对象,这个对象可以从XmlDocument.NameTable和XmlReader.NameTable属性中得到。
下面我们步入代码,比如说查询上面XML中的节点e,分析位置节点e位于:root-&c-&d-&e,然后将所需命名空间值加入到XmlNamespaceManager中(前缀名称无所谓,只要在XPath一致即可),查询即可成功,如下代码:
&&&&&&&&&&&&/*
&&&&&&&&&&&&&&* 假设上面XML文件在C:\a.txt中
&&&&&&&&&&&&&&* 下面代码会查询目标节点e,并输出数据:data in e
&&&&&&&&&&&&&&* */
&&&&&&&&&&&&var&xmlDoc&=&new&XmlDocument();
&&&&&&&&&&&&xmlDoc.Load(@&C:\a.txt&);
&&&&&&&&&&&&//加入命名空间和前缀
&&&&&&&&&&&&var&xmlnsm&=&new&XmlNamespaceManager(xmlDoc.NameTable);
&&&&&&&&&&&&xmlnsm.AddNamespace(&d&,&&dotnet&);
&&&&&&&&&&&&xmlnsm.AddNamespace(&s&,&&silverlight&);
&&&&&&&&&&&&xmlnsm.AddNamespace(&w&,&&wpf&);
&&&&&&&&&&&&var&node&=&xmlDoc.SelectSingleNode(&/d:root/s:c/w:d/s:e&,
&&&&&&&&&&&&Console.WriteLine(node.InnerText);
&&&&&&&&&&&&//输出:data
当然还有一篇帖子也不错,也很值得参考。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:338310次
积分:4298
积分:4298
排名:第5093名
原创:90篇
转载:167篇
评论:24条
(5)(1)(2)(3)(1)(8)(11)(15)(6)(3)(4)(1)(10)(7)(10)(2)(6)(7)(1)(4)(3)(6)(2)(2)(1)(6)(2)(1)(2)(1)(2)(1)(1)(8)(2)(4)(2)(2)(2)(2)(1)(1)(2)(11)(3)(1)(4)(1)(1)(2)(1)(5)(1)(5)(2)(4)(8)(6)(3)(3)(5)(3)(2)(5)(7)(1)(4)(1)(4)(3)(1)18:13 提问
如何读取 这样的XML
取得它的loginname和realname
&cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'&
&cas:authenticationSuccess&
&cas:user&bb&/cas:user&
&cas:attributes
&cas:id&2&/cas:id&
&cas:loginname&bb&/cas:loginname&
&cas:role&2&/cas:role&
&cas:realname&bbggg&/cas:realname&
&/cas:attributes&
&/cas:authenticationSuccess&
&/cas:serviceResponse&
按赞数排序
```void Main()
string xml = @" cas:authenticationSuccesscas:userbbcas:id2cas:loginnamebbcas:role2cas:realnamebbggg";
XDocument xmlPage = XDocument.Parse(xml);
XNamespace ns = "";
var query = from x in xmlPage.Descendants(ns+"authenticationSuccess")
from y in x.Element(ns+"attributes").Elements()
foreach(XElement item in query)
Console.WriteLine("{0}:\t
{1}",item.Name.LocalName,item.Value);
loginname:
void Main()
string xml = @" &cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'&
&cas:authenticationSuccess&
&cas:user&bb&/cas:user&
&cas:attributes
&cas:id&2&/cas:id&
&cas:loginname&bb&/cas:loginname&
&cas:role&2&/cas:role&
&cas:realname&bbggg&/cas:realname&
&/cas:attributes&
&/cas:authenticationSuccess&
&/cas:serviceResponse&";
XDocument xmlPage = XDocument.Parse(xml);
XNamespace ns = "http://www.yale.edu/tp/cas";
var query = from x in xmlPage.Descendants(ns+"authenticationSuccess")
select new
loginname = x.Element(ns+"attributes").Element(ns+"loginname").Value,
realname = x.Element(ns+"attributes").Element(ns+"realname").Value
你的问题主要还是在 XNamespace
如果attatributes下节目未知,直接这样:
var query = from x in xmlPage.Descendants(ns+"authenticationSuccess")
select x.Element(ns+"attributes");
参考这个:
void Main()
string xml = @" &cas:serviceResponse xmlns:cas='http://www.xxx.edu/tp/cas'&
&cas:authenticationSuccess&
&cas:user&bb&/cas:user&
&cas:attributes
&cas:id&2&/cas:id&
&cas:loginname&bb&/cas:loginname&
&cas:role&2&/cas:role&
&cas:realname&bbggg&/cas:realname&
&/cas:attributes&
&/cas:authenticationSuccess&
&/cas:serviceResponse&";
XDocument xmlPage = XDocument.Parse(xml);
XNamespace ns = "http://www.xxx.edu/tp/cas";
var query = from x in xmlPage.Descendants(ns+"authenticationSuccess")
from y in x.Element(ns+"attributes").Elements()
foreach(XElement item in query)
Console.WriteLine("{0}:\t
{1}",item.Name.LocalName,item.Value);
loginname:
248关注|78收录
1644关注|213收录
1119关注|492收录
其他相似问题

我要回帖

更多关于 web.xml xmlns 的文章

 

随机推荐