如何用XPath获取XML实例中choice节点内选中元素的名称?
用XPath获取XML实例中choice节点下的ID元素名称与值
首先,先假设你的XML实例文档大概是这样的(符合你的XSD定义):
<Member> <FirstName>Jane</FirstName> <LastName>Smith</LastName> <DOB>1985-05-15</DOB> <StandardID>S-98765</StandardID> </Member>
由于xs:choice限制了只能出现其中一个ID元素,我们可以利用这个特性,通过XPath精准定位到那个唯一的ID元素,不管choice里的选项怎么变化。
获取ID元素的名称
使用XPath的local-name()函数来获取元素的本地名称(如果你的XML没有命名空间,这个就足够了)。推荐用排除固定元素的方式,比依赖位置更健壮:
local-name(/Member/*[not(self::FirstName or self::LastName or self::DOB)])
这个表达式的逻辑是:找到Member下所有不是FirstName、LastName、DOB的子元素,然后取它的本地名称。因为choice只能有一个元素,所以结果就是你要的ID类型(比如StandardID、Type2ID)。
如果确定前三个元素的位置不会变,也可以用位置定位(但不如上面的方式灵活):
local-name(/Member/*[4])
获取ID元素的值
同样用排除固定元素的方式,直接取该元素的文本内容:
/Member/*[not(self::FirstName or self::LastName or self::DOB)]/text()
或者位置定位的版本:
/Member/*[4]/text()
生成键值对(XPath 2.0+)
如果你的XPath处理器支持2.0及以上版本,可以直接构造一个键值对映射:
map{ local-name(/Member/*[not(self::FirstName or self::LastName or self::DOB)]): /Member/*[not(self::FirstName or self::LastName or self::DOB)]/text() }
这个表达式会返回一个包含ID类型和对应值的map,方便直接使用。
为什么这个方案适配choice的变化
不管你的XSD里的choice节点新增或删除ID选项,只要XML实例符合XSD的规则(即只出现一个ID元素),上面的XPath表达式都能正确定位到目标元素,不需要修改表达式,也不需要依赖外部XSD的定义——完美符合你不能修改XSD且choice可能变化的需求。
内容的提问来源于stack exchange,提问作者xcs4me
相关产品推荐
相关产品推荐

