Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';是否获取XmlDocument.SelectNodes以检索我的任何节点?_C#_.net_Xml_Xpath_Xmldocument - Fatal编程技术网

C# Can';是否获取XmlDocument.SelectNodes以检索我的任何节点?

C# Can';是否获取XmlDocument.SelectNodes以检索我的任何节点?,c#,.net,xml,xpath,xmldocument,C#,.net,Xml,Xpath,Xmldocument,我正在尝试解析一个XML文档。该文档是一个AppxManifest文件 示例文档如下所示: <?xml version="1.0" encoding="utf-8"?> <Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:build="http://schemas.microsoft.com/developer/appx/2012/build" IgnorableNamespaces="b

我正在尝试解析一个XML文档。该文档是一个AppxManifest文件

示例文档如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:build="http://schemas.microsoft.com/developer/appx/2012/build" IgnorableNamespaces="build">
  <Identity Name="uytury" Publisher="hygj" Version="1.0.0.12" ProcessorArchitecture="neutral" />
  <Properties>
    <DisplayName>jhjj</DisplayName>
    <PublisherDisplayName>bhhjb</PublisherDisplayName>
    <Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Prerequisites>
    <OSMinVersion>6.2.1</OSMinVersion>
    <OSMaxVersionTested>6.2.1</OSMaxVersionTested>
  </Prerequisites>
  <Resources>
    <Resource Language="EN" />
  </Resources>
  <Applications>
    <Application Id="App" Executable="gfg.exe" EntryPoint="gfg.App">
      <VisualElements DisplayName="fdsf" Logo="Assets\Logo.png" SmallLogo="Assets\SmallLogo.png" Description="gfdsg" ForegroundText="light" BackgroundColor="#2672EC">
        <DefaultTile ShowName="allLogos" WideLogo="Assets\WideLogo.png" ShortName="gfdsg" />
        <SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#2672EC" />
        <InitialRotationPreference>
          <Rotation Preference="portrait" />
          <Rotation Preference="landscape" />
          <Rotation Preference="portraitFlipped" />
          <Rotation Preference="landscapeFlipped" />
        </InitialRotationPreference>
      </VisualElements>
      <Extensions>
        <Extension Category="windows.search" />
        <Extension Category="windows.shareTarget">
          <ShareTarget>
            <DataFormat>Text</DataFormat>
          </ShareTarget>
        </Extension>
      </Extensions>
    </Application>
  </Applications>
  <build:Metadata>
    <build:Item Name="TargetFrameworkMoniker" Value=".NETCore,Version=v4.5" />
    <build:Item Name="VisualStudio" Version="11.0" />
    <build:Item Name="OperatingSystem" Version="6.2.9200.16384 (win8_rtm.120725-1247)" />
    <build:Item Name="Microsoft.Build.AppxPackage.dll" Version="11.0.50727.1" />
    <build:Item Name="Microsoft.Windows.UI.Xaml.Build.Tasks.dll" Version="11.0.50727.1" />
  </build:Metadata>
</Package>
但是,在执行此操作之后,
节点
将永远不会包含任何内容。xml文档被加载了,尽管如此。使用
SelectNodes(“//*”)
按预期返回每个节点。我这里有什么问题

我还尝试了该XPath查询的许多变体,例如

  • /Package/Applications/Application
  • 应用程序/应用程序
  • Applications/*

但是,似乎没有检索到单个节点。理想情况下,我希望节点包含所有
应用程序
节点

您必须专门使用xml名称空间来选择它们。考虑

"//*[local-name()='Applications']/*[local-name()='Application']"    
在您的情况下,此代码也可以很好地工作:

var doc = new XmlDocument();
doc.LoadXml(xml);
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("a", "http://schemas.microsoft.com/appx/2010/manifest");
var nodes = doc.SelectNodes("//a:Applications/a:Application",nsmgr);

你可能需要看看这个

这是您的代码:

var xml = new XmlDocument();
xml.Load("myXMLFile1.xml");
var mgr = new XmlNamespaceManager(xml.NameTable);
mgr.AddNamespace("", "http://schemas.microsoft.com/appx/2010/manifest");
XmlNode root = xml.DocumentElement;
var nodes = root.SelectNodes("//*[local-name()='Applications']/*[local-name()='Application']");

您需要在NamespaceManager和XPath中为名称空间指定前缀。请注意,前缀不需要匹配XPath和命名空间管理器之间的任何内容*

var xml=new XmlDocument();
xml.Load(myfile);
var mgr=new XmlNamespaceManager(xml.NameTable);
mgr.AddNamespace("a", "http://schemas.microsoft.com/appx/2010/manifest");
mgr.AddNamespace("bar", "http://schemas.microsoft.com/developer/appx/2012/build");
var nodes=xml.SelectNodes("//a:Applications", mgr);
正如其他答案所指出的,接受任何名称空间的XPath是另一种选择


*)例如,在您的特定示例中,有两个名称空间“default”(注意,默认前缀与空名称空间不同)和“build”。因此,当您定义名称空间管理器时,需要为每个名称空间指定一个前缀(如果您需要同时以这两个名称空间中的节点为目标),但前缀可以是任意字符串(对前缀有效,但不能为空)。也就是说,使用“a”表示XML中的“默认”命名空间,使用“bar”表示映射到“build”的命名空间。

在这种情况下不是这样,但一般来说,如果实际XML中的命名空间URN与用于向命名空间管理器添加命名空间的URN不完全相同(例如:缺少尾部斜杠),并且在XPath中指定了前缀,查询可能返回
null

如果XML中的名称空间URN不可靠,请使用语法

"//*[local-name()='tag']" 

将起作用。

您的标题谈到XDocument,但您的代码使用XmlDocument。如果您真的使用LINQtoXML,我建议您使用子体。。。LINQtoXML是一种选择吗?@JonSkeet很遗憾,我们不能使用LINQtoXML,因为我们的目标是.NET2.0。然而,我想把XML文档放在这里。我总是把这两个混淆,因为第一个我得到的“表达式必须计算为一个节点集”啊,现在可以了。碰巧有更干净的方法吗?我从来没有用XPath处理过名称空间,所以我习惯了一些简单而干净的东西,比如
/Applications/Application
,我几个月前不得不使用它,但找不到更干净的语法,但是.net framework系统libs不支持XPath 2.0“//*:name”。您可以找到第三方XPath 2.0和XSTL 2.0产品。哦,您可以通过此重载指定所需的名称空间,但是在我的例子中,我处理的是可能声明了不同名称空间/名称空间版本的通用请求,因此解析名称空间不是Mealth的选项,尽管您进行了很多修改,我认为你提供了最完整的答案。其他人提到了名称空间的命名,但您也加入了重载以使其实际工作,并且为了使我的XPath查询更简洁明了:)谢谢!我确实读过:)我只是没有意识到,与没有名称空间的XML文件相比,它会如此彻底地改变我的XPath查询。使用该代码,我得到了“需要名称空间管理器或XsltContext。此查询具有前缀、变量或用户定义函数”,这对我来说没有任何意义,因为我有一个名称空间管理器?我认为
//a:Applications
a:Package/a:Applications
,因为该节点不直接位于根目录下。命名空间管理器应传递给
SelectNodes
SelectNodes(“//a:Applications”,mgr)@Earlz,示例已修复(我希望)-忘记传递名称空间管理器。还有内联的MiMo建议。
"//*[local-name()='tag']"