2016-12-30 12 views
1

私はdependentAssemblyのcodebase属性を返す必要がある(すなわちasmv1:アセンブリ=>依存=> dependentAssembly(第1)=> codebase属性を)この要素のxpathを取得するにはどうすればよいですか?

ここでは、XMLファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly xsi:schemaLocation="urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd" manifestVersion="1.0" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns="urn:schemas-microsoft-com:asm.v2" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xrml="urn:mpeg:mpeg21:2003:01-REL-R-NS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:co.v1="urn:schemas-microsoft-com:clickonce.v1" xmlns:co.v2="urn:schemas-microsoft-com:clickonce.v2"> 
    <assemblyIdentity name="program.application" version="3.4.95.1045" publicKeyToken="98ecb8aa8cf73f16" language="neutral" processorArchitecture="msil" xmlns="urn:schemas-microsoft-com:asm.v1" /> 
    <description asmv2:publisher="publisher" asmv2:product="Magical Christmas Land" xmlns="urn:schemas-microsoft-com:asm.v1">Magical Christmas Land</description> 
    <deployment install="true" minimumRequiredVersion="3.4.95.1045" co.v1:createDesktopShortcut="true"> 
    <subscription> 
     <update> 
     <beforeApplicationStartup /> 
     </update> 
    </subscription> 
    </deployment> 
    <compatibleFrameworks xmlns="urn:schemas-microsoft-com:clickonce.v2"> 
    <framework targetVersion="4.5.2" profile="Client" supportedRuntime="4.0.30319" /> 
    <framework targetVersion="4.5.2" profile="Full" supportedRuntime="4.0.30319" /> 
    </compatibleFrameworks> 
    <dependency> 
    <dependentAssembly dependencyType="install" codebase="3.0.8\program.exe.manifest" size="214085"> 
     <assemblyIdentity name="program.exe" version="3.0.8" publicKeyToken="48ecb8aa8cf73f16" language="neutral" processorArchitecture="msil" type="win32" /> 
     <hash> 
     <dsig:Transforms> 
      <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" /> 
     </dsig:Transforms> 
     <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" /> 
     <dsig:DigestValue>rawr</dsig:DigestValue> 
     </hash> 
    </dependentAssembly> 
    </dependency> 

ここです私が試したもの:

これは、アセンブリ要素を取り込み、その中に7つの子ノード(依存関係の1つ)を取り出します。 "/ asmv1:assembly/dependency"を追加するとすぐに失敗し、nullが返されます。

 var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); 
     nsmgr.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1"); 

     var node = xmlDoc.DocumentElement.SelectSingleNode(@"/asmv1:assembly", nsmgr); 

これは動作しますが、それは超醜いです:

var childNode = node.ChildNodes 
          .OfType<XmlElement>() 
          .First(n => n.LocalName == "dependency") 
          .ChildNodes[0] 
          .Attributes["codebase"].InnerText; 
+0

あなたは 'asmv1を試してみました:アセンブリ/ asmv1:dependency'を?これはおそらく動作しませんが、あなたは知らないでしょう。 – G0dsquad

+0

@ G0dsquadいいえ、動作しませんでした – FrankerZ

答えて

3

dependencyは、URIがurn:schemas-microsoft-com:asm.v2あるデフォルトの名前空間を継承します

var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); 
nsmgr.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1"); 
nsmgr.AddNamespace("asmv2", "urn:schemas-microsoft-com:asm.v2"); 

var node = xmlDoc.DocumentElement.SelectSingleNode(@"/asmv1:assembly/asmv2:dependency", nsmgr); 
+0

ありがとう!参考までに、最終的なxpathは '/ asmv1:assembly/asmv2:dependency/asmv2:dependentAssembly [1]/@ codebase'でした – FrankerZ

関連する問題