检查VTD-XML中的XPath是否正在评估XML标记(或)文本(或)标记列表(或)文本列表

时间:2017-11-23 11:30:09

标签: java xml xpath vtd-xml

将以下XML示例结构视为输入。 我正在使用VTD-XML:2.11来使用Java-8解析XML。这些场景就像我需要根据提供的XPath解析下面的XML并返回包含XPath评估的值的List。在任何时候,每次我的解析将新XML作为新XPath的输入时,需要解析的XML和XPath都不会被修复。

Ex1: XPath: //CATALOG/CD/TITLE/text()
 output: - Empire Burlesque
         - Still got the blues
         - Hide your heart

Ex2: XPath: //CATALOG/CD/TITLE
 output: - <TITLE id="1">Empire Burlesque</TITLE>
         - <TITLE>Still got the blues</TITLE>
         - <TITLE>Hide your heart</TITLE>

我面临的一个主要问题是我无法检查评估的XPath是XML元素还是XML文本?

注意:我不想检查给定的XPath是否以&#34; text()&#34;结尾?知道XPath评估是文本还是元素。

<CATALOG>
 <CD>
    <TITLE id="1">Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
 </CD>
 <CD>
    <TITLE>Still got the blues</TITLE>
    <ARTIST>Gary More</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>Virgin redords</COMPANY>
    <PRICE>10.20</PRICE>
    <YEAR>1990</YEAR>
 </CD>
 <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
 </CD>
</CATALOG>

如果有人希望我添加额外信息以便完全理解我的问题,请告诉我。

1 个答案:

答案 0 :(得分:1)

我认为您已经明白了objecttext()错误的含义。您在第一个示例中获得的简单文本仍然是XML ..,尽管它缺少任何标记。

我不知道,如果这对你来说很重要,但想象一下像这里的嵌套结构:

xml element

没有<CATALOG> <CD> <TITLE id="1">Empire Burlesque<SubNode>Some Value here</SubNode>Some more Text</TITLE> <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </CATALOG> 的XPath将返回所有内容。您甚至需要text()text()[1]来获取现有的两个文本部分。

如果您可以肯定,没有更深层次的嵌套,您可以将代码的结果作为xml处理,并使用text()[2]的XPath再次查询它。这应该在两种情况下都提供裸文。

提示

如果XML在您的控制之下,您可能会考虑像这样的XML:

'(//text())[1]'

一个工作示例(但不在您的工具中)

<CATALOG>
    <CD Titel="Some title" Artist="Some artist" ... more attriubtes ... />
</CATALOG>

结果

enter image description here

这是DECLARE @tbl TABLE(YourXml XML); INSERT INTO @tbl VALUES (N'<CATALOG> <CD> <TITLE id="1">Empire Burlesque</TITLE> </CD></CATALOG>') ,(N'<CATALOG><CD> <TITLE>Still got the blues</TITLE> </CD></CATALOG>') ,(N'<CATALOG><CD> <TITLE>Hide your heart</TITLE> </CD> </CATALOG>'); SELECT YourXml.query('(/CATALOG/CD/TITLE/text())[1]') ,YourXml.query('(/CATALOG/CD/TITLE/text())[1]').value('(//text())[1]','nvarchar(max)') ,YourXml.query('(/CATALOG/CD/TITLE)[1]') ,YourXml.query('(/CATALOG/CD/TITLE)[1]').value('(//text())[1]','nvarchar(max)') FROM @tbl; 但您可以看到,我拨打了T-SQL两次,一次是.query(),而是没有。一个返回裸文本(但仍然是XML),一个返回text()标记内的文本。 <TITLE> .value() XPath的{​​{1}}将返回找到的第一个'(//text())[1]'