Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 在*value*中带有前缀的XML属性-如何判断它是名称空间前缀?_Java_Xml_Xml Namespaces_Xml Attribute - Fatal编程技术网

Java 在*value*中带有前缀的XML属性-如何判断它是名称空间前缀?

Java 在*value*中带有前缀的XML属性-如何判断它是名称空间前缀?,java,xml,xml-namespaces,xml-attribute,Java,Xml,Xml Namespaces,Xml Attribute,我正在编写一段代码,在任意XML中重新组织名称空间,可能会更改它们的前缀。这非常简单,直到我遇到xsi:type属性: <foo xsi:type="xs:string">...</foo> 。。。 如果我更改XSD名称空间的xs前缀,我必须对这个xsi:type值执行相同的操作,例如,into <foo i:type="x:string">...</foo> 。。。 这个属性是众所周知的。但是,一般来说,如果我发现这样的代码: <f

我正在编写一段代码,在任意XML中重新组织名称空间,可能会更改它们的前缀。这非常简单,直到我遇到xsi:type属性:

<foo xsi:type="xs:string">...</foo>
。。。
如果我更改XSD名称空间的xs前缀,我必须对这个xsi:type值执行相同的操作,例如,into

<foo i:type="x:string">...</foo>
。。。
这个属性是众所周知的。但是,一般来说,如果我发现这样的代码:

<foo xmlns:aaa="http://bbb">
   <bar name="aaa:123">...</bar>
</foo>

...
有没有办法判断“aaa:123”值中的“aaa”部分指的是“”命名空间

也就是说,名称可能只是“aaa:123”,没有任何预期的对带有“aaa”前缀的名称空间的引用,匹配是偶然的

如果有帮助的话,实现语言是Java

更新/解决方案

感谢下面答案中提供的有用解释和指针,我修改了代码,使其在遇到带有前缀值的属性时能够按照以下规则工作:

  • 对于xsi:type属性,更新属性值的前缀以匹配 的新前缀
  • 如果在当前上下文中没有具有匹配前缀的命名空间,
    该值被视为文字(而不是QName),并保持原样
  • 如果在当前 上下文存在具有匹配前缀的命名空间,我们无法确定 如果属性值是literal或QName,那么代码将取消 处理并使文档保持原样。该文件不正确 根本没有修改
对于任何感兴趣的人


我知道逻辑可以通过不涉及受不明确属性影响的名称空间来改进,但对我来说已经足够好了(tm)。

如果不知道应用程序对XML的解释,这是不可能的。但是,有一个很弱的约定,即如果所讨论的属性或元素的XML模式数据类型为
xsd:QName
(因此,所讨论的XML必须首先由XML模式描述),那么属性或元素的值将服从命名空间规范化


另请参见。

如果不知道应用程序对XML的解释,这在一般情况下是不可能的。但是,有一个很弱的约定,即如果所讨论的属性或元素的XML模式数据类型为
xsd:QName
(因此,所讨论的XML必须首先由XML模式描述),那么属性或元素的值将服从命名空间规范化


另请参见。

模式将告诉您属性的类型是否为
xs:QName
,但不会告诉您它是一个名称空间敏感的XPath表达式(例如XSLT中的
xsl:value of/@select
,或XSD中的
xs:selector/@XPath
)。即使您知道这些属性是名称空间敏感的,也需要进行大量详细的解析来提取和替换名称空间前缀

因此,即使使用模式,在一般情况下也不可能完成任务


不幸的是,你不是第一个遇到这个问题的人。定义XPath使用的数据模型总是受到内容中的QName(或者更一般地说,内容中的前缀)问题的困扰

模式将告诉您属性的类型是否为
xs:QName
,但不会告诉您它是名称空间敏感的XPath表达式(例如XSLT中的
xsl:value of/@select
,或XSD中的
xs:selector/@XPath
)。即使您知道这些属性是名称空间敏感的,也需要进行大量详细的解析来提取和替换名称空间前缀

因此,即使使用模式,在一般情况下也不可能完成任务


不幸的是,你不是第一个遇到这个问题的人。定义XPath使用的数据模型总是受到内容中的QName(或者更一般地说,内容中的前缀)问题的困扰

属性的内容(以及元素中的
text()
)不存在于任何命名空间中。命名空间与包含的属性(或元素)相关。在大多数情况下,属性与其元素位于同一名称空间中,为属性定义不同的名称空间相当奇怪。但这并不是不寻常的。我认为没有其他机会在字符串级别检查这个问题(在内容开头找到
xyz:
)。但这可能会意外失败…属性的内容(以及元素中的
text()
)不存在于任何命名空间中。命名空间与包含的属性(或元素)相关。在大多数情况下,属性与其元素位于同一名称空间中,为属性定义不同的名称空间相当奇怪。但这并不是不寻常的。我认为没有其他机会在字符串级别检查这个问题(在内容开头找到
xyz:
)。但这可能会意外失败…谢谢你的链接!它突然扩展了我的XML意识视野,让我感到头晕目眩。谢谢你的链接!它突然扩展了我的XML意识视野,让我感到头晕目眩。谢谢。不幸的是,从我的代码所在的层访问模式代价高昂。而且,正如您所说,即使使用模式,通用解决方案也是不可能的,如果找到了QName外观的属性,我应该选择取消处理。谢谢。不幸的是,从我的代码所在的层访问模式代价高昂。而且,正如您所说,即使使用模式,通用解决方案也是不可能的,因此如果找到了QName外观的属性,我应该选择取消处理。