Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
我应该使用什么名称空间来搜索此XML文档?_Xml_Xpath - Fatal编程技术网

我应该使用什么名称空间来搜索此XML文档?

我应该使用什么名称空间来搜索此XML文档?,xml,xpath,Xml,Xpath,我试图在下面的XML中找到节点“PermissionSet”。我对XPath不是很熟悉,所以我尝试遍历树以到达我想要的节点 我按如下方式加载XML: var reader = new XmlTextReader(manifestFilename) XNamespace _manifestNamespace = "urn:schemas-microsoft-com:asm.v1"; _appManifest = XElement.Load(reader); var node1 = _appMani

我试图在下面的XML中找到节点“PermissionSet”。我对XPath不是很熟悉,所以我尝试遍历树以到达我想要的节点

我按如下方式加载XML:

var reader = new XmlTextReader(manifestFilename)
XNamespace _manifestNamespace = "urn:schemas-microsoft-com:asm.v1";
_appManifest = XElement.Load(reader);
var node1 = _appManifest.Elements(_manifestNamespace + "trustInfo").FirstOrDefault();
var node2 = node1.Elements(_manifestNamespace + "security").FirstOrDefault();
var node3 = node2.Elements(_manifestNamespace + "applicationRequestMinimum").FirstOrDefault();
var node4 = node3.Elements(_manifestNamespace + "PermissionSet").FirstOrDefault();
我的第一个节点一直是空的。我怀疑我使用的名称空间是错误的,但我不知道该使用什么。以下是XML:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
            If you want to change the Windows User Account Control level replace the 
            requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Specifying requestedExecutionLevel node will disable file and registry virtualization.
            If you want to utilize File and Registry Virtualization for backward 
            compatibility then delete the requestedExecutionLevel node.
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
</asmv1:assembly>

xmlns=
属性声明了一个默认名称空间,该名称空间应用于从它出现的元素开始的所有无前缀元素,并“继承”到它的所有子元素,直到并且除非另一个
xmlns=
属性出现以设置不同的默认值(或者如果值为
,则将默认值设置为无名称空间)

请注意,默认名称空间仅适用于元素。除非属性的限定名包含名称空间前缀,否则属性永远不会使用名称空间。

您尝试选择的元素驻留在此名称空间中:“urn:schemas microsoft com:asm.v2”。从它的祖先
元素继承的:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    ........
        <PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" />
    ........
</trustInfo>
更新:

您的评论是正确的,如果缺少任何元素(最后一个元素PermissionSet除外),我的代码将抛出null引用异常。但这不是这个答案的重点,这只是为了简单。总之,避免这种异常的更干净的方法是使用XPath查询:

var nsManager = new XmlNamespaceManager(new NameTable());
nsManager.AddNamespace("v2", "urn:schemas-microsoft-com:asm.v2");
var result = _appManifest
                .Root
                .XPathSelectElement(
                    "./v2:trustInfo/v2:security/v2:applicationRequestMinimum/v2:PermissionSet"
                    , nsManager);

XPathSelectElement()
对于处理结构不受控制的XML更加健壮。无论缺少什么元素/属性,它都不会引发异常。如果没有与XPath参数匹配的元素,它会平静地返回
null

我明白你的意思,但是我想要的元素不在v3名称空间中。它在外面的v2区。谢谢-这起作用了。但是,您的示例代码不是假设所有节点都存在吗?如果没有安全措施怎么办?您的示例会爆炸吗?还是在“.Element”实现中处理了这种情况?我喜欢您的做法,但是appManifest没有.Root属性。它被定义为一个元素。你的来自哪里?我尝试使用
XDocument
而不是
XElement
。这就是为什么
\u appManifest
在我的示例代码中具有
Root
属性的原因。
XNamespace v2 = "urn:schemas-microsoft-com:asm.v2";
var result = _appManifest.Root
                         .Element(v2 + "trustInfo")
                         .Element(v2 + "security")
                         .Element(v2 + "applicationRequestMinimum")
                         .Element(v2 + "PermissionSet");
var nsManager = new XmlNamespaceManager(new NameTable());
nsManager.AddNamespace("v2", "urn:schemas-microsoft-com:asm.v2");
var result = _appManifest
                .Root
                .XPathSelectElement(
                    "./v2:trustInfo/v2:security/v2:applicationRequestMinimum/v2:PermissionSet"
                    , nsManager);