Reputation: 22911
I need to return the codebase attribute of dependentAssembly (ie. asmv1:assembly => dependency => dependentAssembly (First one) => codebase attribute)
Here is the XML file:
<?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>
Here's what I tried:
This works and fetches the assembly element, and within it the 7 child nodes (dependency being one of them). As soon as I add "/asmv1:assembly/dependency" it fails and returns null.
var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1");
var node = xmlDoc.DocumentElement.SelectSingleNode(@"/asmv1:assembly", nsmgr);
This works, but it's super ugly:
var childNode = node.ChildNodes
.OfType<XmlElement>()
.First(n => n.LocalName == "dependency")
.ChildNodes[0]
.Attributes["codebase"].InnerText;
Upvotes: 2
Views: 501
Reputation: 89285
dependency
inherits the default namespace which URI is 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);
Upvotes: 6