【问题标题】:Which namespace is necessary to use SelectSingleNode() method (using default namespace and can't use the method)使用 SelectSingleNode() 方法需要哪个命名空间(使用默认命名空间,不能使用该方法)
【发布时间】:2013-01-19 19:59:50
【问题描述】:

您好,我有使用不同命名空间的 xml 文件(实际上是 msbuild 文件)

<?xml version="1.0" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(key)'=='1111'">
          <Key>Value</Key>
    </PropertyGroup>
</Project>

但问题是我不能在该文件中使用 SelectSingleNode,因为

xmlns="http://schemas.microsoft.com/developer/msbuild/2003"

我相信这是因为上面的 xmlns 导致默认命名空间(该方法所必需的)消失了。然后我想我只需要为此添加必要的一个..但我的尝试根本没有成功。你能给我一个简单的例子吗?

这就是我的做法。 (我也尝试添加多个命名空间但没有成功..)

XmlDocument xml = new XmlDocument();
xml.Load("ref.props");        
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");

XmlNode platform_node
  = xml.SelectSingleNode("//msbld:PropertyGroup[contains(@Condition, '1111')]", nsmgr);

【问题讨论】:

标签: c# xml xmldocument msxml selectsinglenode


【解决方案1】:

你需要使用正确的命名空间,http://schemas.microsoft.com/developer/msbuild/2003”。

试试

XmlDocument xml = new XmlDocument();
xml.Load("ref.props");        
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ms", "http://schemas.microsoft.com/developer/msbuild/2003");

XmlNode platform_node
  = xml.SelectSingleNode("/ms:Project/ms:PropertyGroup[contains(@Condition, '1111')]",
                         nsmgr);

不要将命名空间前缀(在 XML 中为空)与命名空间“http://schemas.microsoft.com/developer/msbuild/2003”混淆。

【讨论】:

  • 尝试删除[contains],看看有什么收获。
  • 删除包含时出现“对象引用未设置为对象实例”错误。
  • 你在哪一行得到的?我敢打赌是在你的 SelectSingleNode 之后。
  • 哦..是的,它是在 SelectSingleNode 之后!对此感到抱歉
  • 我可以再问一个问题吗?我需要获取该属性组的子节点。但是子节点的名称是动态的,我不能只在 xpath 查询中附加名称。但我有一个包含子节点名称的字符串变量。那么,在这种情况下,我应该如何编写 xpath 查询,以便我只能在父节点内查询并使用字符串变量?
猜你喜欢
  • 2017-01-03
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2023-03-07
  • 2010-10-14
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多