Ear*_*rlz 15 .net c# 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="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>
Run Code Online (Sandbox Code Playgroud)
我尝试像这样解析它:
var xml=new XmlDocument();
xml.Load(myfile);
var mgr=new XmlNamespaceManager(xml.NameTable);
mgr.AddNamespace("", "http://schemas.microsoft.com/appx/2010/manifest");
var nodes=xml.SelectNodes("Applications");
Run Code Online (Sandbox Code Playgroud)
但是,在我执行此操作后,nodes将永远不会包含任何内容.虽然加载了xml文档.using SelectNodes("//*")按预期返回每个节点.我的问题在这里是什么?
我也尝试过很多关于XPath查询的变体,例如
/Package/Applications/ApplicationApplications/ApplicationApplications/*但是,似乎没有任何东西可以检索单个节点.理想情况下,我希望节点包含所有Application节点
aio*_*sov 36
您必须专门使用xml命名空间来选择它们.考虑
"//*[local-name()='Applications']/*[local-name()='Application']"
Run Code Online (Sandbox Code Playgroud)
在您的情况下,此代码也可以正常工作:
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);
Run Code Online (Sandbox Code Playgroud)
您需要在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);
Run Code Online (Sandbox Code Playgroud)
正如其他答案所指出的,接受任何命名空间的XPath是另一种选择.
*)即在您的特定示例中有2个名称空间"default"(请注意,默认前缀与空名称空间不同)和"build".所以,当你定义你的命名空间管理,你需要指定一个前缀为每个命名空间(如果你需要的目标中的两个节点),但前缀可以是任意的字符串(有效期为前缀,但不为空).即,对于"默认"命名空间使用"a",对于映射到XML中的"build"的命名空间使用"bar".
不是在这种特殊情况下,但一般来说,如果实际 XML 中的命名空间 URN 与用于向命名空间管理器添加命名空间的命名空间不完全相同(例如:缺少尾部斜杠),并且在 XPath 中指定了前缀,查询可能返回null。
如果 XML 中的命名空间 URN 不可靠,语法
"//*[local-name()='tag']"
Run Code Online (Sandbox Code Playgroud)
将工作。
| 归档时间: |
|
| 查看次数: |
32135 次 |
| 最近记录: |