如何获取单个XML元素的所有名称空间声明

iva*_*vic 7 xml xpath xquery

如何使用XPath查询(甚至XQuery)来获取单个元素的nampespace前缀声明?我想检查它们是否在超过1个位置定义.

例如,对于第一个元素,它将是xmlns和xmlns:n,仅用于第二个xmlns; 对于第一个<n:int>,它什么都不是,等等.

我只能找到这些我只能使用名称空间,但不是我真正想要的.

<?xml version="1.0" encoding="UTF-8"?>
    <root>
        <plus xmlns="http://lalaivana.me/calc/"
            xmlns:n="http://lalaivana.me/numbers/" >
            <n:int value="4"/>
            <n:int value="5"/>
        </plus>
        <plus xmlns="http://lalaivana.me/calc/">
            <int value="4" xmlns="http://lalaivana.me/numbers/" />
            <int value="5"/>
        </plus>
    </root>
Run Code Online (Sandbox Code Playgroud)

Mad*_*sen 4

您可以使用函数in-scope-prefixes()namespace-uri-for-prefix()来获取绑定到元素的范围内命名空间的命名空间前缀和命名空间 uri。

for $element in $doc//*
return 
  for $prefix in fn:in-scope-prefixes($element)
  return string-join( (name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element) ), "|")
Run Code Online (Sandbox Code Playgroud)

请注意,XML 命名空间http://www.w3.org/XML/1998/namespace将包含在前缀 中xml。您可以使用谓词过滤器排除它:

for $element in $doc//*:plus[2]
return 
  for $prefix in fn:in-scope-prefixes($element)[not(. eq 'xml')]
  return string-join((name($element), $prefix,fn:namespace-uri-for-prefix($prefix, $element)), "|")
Run Code Online (Sandbox Code Playgroud)

  • 解析 XML 后您将无法获得该信息。您将需要使用 API(例如 SAX)来响应解析事件并收集该信息。 (2认同)