【问题标题】:What's wrong with my XPath/XML?我的 XPath/XML 有什么问题?
【发布时间】:2010-09-11 08:10:45
【问题描述】:

我正在this xml 上尝试一个非常基本的 XPath(如下所示),但它没有找到任何东西。 我正在尝试 .NET 和 this website,而诸如 //PropertyGroup/PropertyGroup//MSBuildCommunityTasksPath 之类的 XPath 根本不适合我(它们编译但返回零结果)。

源 XML:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- $Id: FxCop.proj 114 2006-03-14 06:32:46Z pwelter34 $ -->
    <PropertyGroup>
        <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
    </PropertyGroup>
    <Import
        Project="$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets" />
    <Target Name="DoFxCop">
        <FxCop TargetAssemblies="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll"
            RuleLibraries="@(FxCopRuleAssemblies)" 
            AnalysisReportFileName="Test.html"
            DependencyDirectories="$(MSBuildCommunityTasksPath)" 
            FailOnError="True"
            ApplyOutXsl="True"
            OutputXslFileName="C:\Program Files\Microsoft FxCop 1.32\Xml\FxCopReport.xsl" />
    </Target>
</Project>

【问题讨论】:

  • 如果您可以提供一个简短的代码示例,说明您在 .net 中尝试过的内容,则可以更轻松地提出可能出现的问题。

标签: xml xpath namespaces


【解决方案1】:

您可以在代码中添加命名空间等等,但您可以有效地使用通配符命名空间。试试下面的 XPath 习惯用法。

//*[local-name()='PropertyGroup']
//*[local-name()='MSBuildCommunityTasksPath']

name() 通常也可以,如:

//*[name()='PropertyGroup']
//*[name()='MSBuildCommunityTasksPath']

编辑:命名空间很棒,我并不是说它们不重要,但是在将原型代码、一次性桌面工具、XSLT 试验和等等。平衡您对便利的需求与手头任务的可接受风险。仅供参考,如果需要,您还可以剥离或重新分配命名空间。

【讨论】:

  • 谢谢!你不知道我为这个答案寻找了多久。太棒了!
  • @Abel Morelos - 很高兴它有帮助;当我终于在许多个月前发现了这一点时,它使 XML 的工作如此变得容易得多。
  • 取消资格是一件坏事。这相当于从 RDBMS 中询问列而不指定哪些表。每个前缀声明的一行代码如何变成“以及所有这些”?
  • @grantwparks - 我并不是说命名空间没有价值,但有时需要构建一个忽略它们的转换,有时不处理它们只是为了方便。无论如何,这个解决方案都会派上用场。
  • HOURS 搜索在此终止。谢谢!
【解决方案2】:

文档中的标签最终位于由 xmlns 属性创建的“默认”命名空间中,没有前缀。不幸的是,仅 XPath 无法查询默认命名空间中的元素。我实际上并不确定语义细节,但您必须使用托管 XPath 的任何工具显式地将前缀附加到该命名空间。

在 .NET 中可能有更短的方法来执行此操作,但我见过的唯一方法是通过 NameSpaceManager。显式添加命名空间后,您可以使用命名空间管理器进行查询,就好像命名空间元素中的所有标签都具有该前缀(我选择了“msbuild”):

using System;
using System.Xml;

public class XPathNamespace {
    public static void Main(string[] args) {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(
    @"<?xml version=""1.0"" encoding=""utf-8""?>
<Project xmlns=""http://schemas.microsoft.com/developer/msbuild/2003"">
    <!-- $Id: FxCop.proj 114 2006-03-14 06:32:46Z pwelter34 $ -->

    <PropertyGroup>
        <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\bin\Debug</MSBuildCommunityTasksPath>
    </PropertyGroup>

    <Import Project=""$(MSBuildProjectDirectory)\MSBuild.Community.Tasks\MSBuild.Community.Tasks.Targets""/>

    <Target Name=""DoFxCop"">

        <FxCop 
            TargetAssemblies=""$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.dll""
            RuleLibraries=""@(FxCopRuleAssemblies)"" 
            AnalysisReportFileName=""Test.html""
            DependencyDirectories=""$(MSBuildCommunityTasksPath)""
            FailOnError=""True""
            ApplyOutXsl=""True""
            OutputXslFileName=""C:\Program Files\Microsoft FxCop 1.32\Xml\FxCopReport.xsl""
        />
    </Target>

</Project>");

        XmlNamespaceManager namespaceManager = new
    XmlNamespaceManager(xmlDocument.NameTable);
        namespaceManager.AddNamespace("msbuild", "http://schemas.microsoft.com/developer/msbuild/2003");
        foreach (XmlNode n in xmlDocument.SelectNodes("//msbuild:MSBuildCommunityTasksPath", namespaceManager)) {
            Console.WriteLine(n.InnerText);
        }
    }
}

【讨论】:

    【解决方案3】:

    您的问题在于命名空间 (xmlns="http://schemas.microsoft.com/developer/msbuild/2003")。您收到零节点是因为您没有使用命名空间对其进行限定。如果您删除 xmlns 属性,您的“//PropertyGroup”XPath 将起作用。您如何使用命名空间进行查询通常涉及将默认 xmlns 别名为标识符(因为未在属性上指定一个),并选择“//myXMLNStoken:PropertyGroup”。

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多