我知道这个问题之前已经以类似的方式提出过,但我似乎无法让这个问题起作用。
我有一些xml:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<Research xmlns="http://www.rixml.org/2005/3/RIXML" xmlns:xalan="http://xml.apache.org/xalan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" createDateTime="2011-03-29T15:41:48Z" language="eng" researchID="MusiJvs3008">
<Product productID="MusiJvs3008">
<StatusInfo currentStatusIndicator="Yes" statusDateTime="2011-03-29T15:41:48Z" statusType="Published" />
<Source>
<Organization type="SellSideFirm" primaryIndicator="Yes">
<OrganizationID idType="Reuters">9999</OrganizationID>
我正在尝试使用xpath读取值:
XPathDocument xmldoc = new XPathDocument(xmlFile);
XPathNavigator nav = xmldoc.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace(string.Empty, "http://www.rixml.org/2005/3/RIXML");
XPathNavigator result = nav.SelectSingleNode("/Research", nsMgr); // <-- Returns null!
但即使是简单的根节点选择也会返回null!我确信我的命名空间有问题。有人可以帮忙吗?
理想情况下,我想要简单的行,让我从xml文件中选择值,即
String a = xmlDoc.SelectSingleNode(@"/Research/Product/Content/Title").Value;
顺便说一下,我没有(直接)控制XML文件内容。
答案 0 :(得分:5)
我不相信你可以使用一个空的命名空间别名,并让它由XPath表达式自动使用。只要你使用一个实际的别名,它应该工作。这个测试很好,例如:
using System;
using System.Xml;
using System.Xml.XPath;
class Test
{
static void Main()
{
string xmlFile = "test.xml";
XPathDocument xmldoc = new XPathDocument(xmlFile);
XPathNavigator nav = xmldoc.CreateNavigator();
XmlNamespaceManager nsMgr = new XmlNamespaceManager(nav.NameTable);
nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML");
XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
Console.WriteLine(result);
}
}
顺便说一下,你 使用XPath和XPathDocument
吗?我倾向于发现LINQ to XML是一个很多更令人愉快的API,特别是在命名空间方面。如果您使用的是.NET 3.5并且没有特别要求使用XPath,我建议您查看它。
答案 1 :(得分:3)
进行以下更改
nsMgr.AddNamespace("x", "http://www.rixml.org/2005/3/RIXML");
XPathNavigator result = nav.SelectSingleNode("/x:Research", nsMgr);
答案 2 :(得分:0)
我可以发布并回答我自己的问题,因为 native 相当于此代码。相反,我只是将它作为答案添加到最后。
使用本机IXMLDOMDocument
(版本6)对象时:
//Give the default namespace as alias of "x"
document.setProperty("SelectionNamespaces","xmlns:x='http://www.rixml.org/2005/3/RIXML'");
//Query for the nodes we want
document.selectSingleNode("/x:Research");
奖金问题:为什么,为什么,没有指定名称空间时,没有Xml Document对象模型查询默认名称空间... 叹息