将以下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>
如果有人希望我添加额外信息以便完全理解我的问题,请告诉我。
答案 0 :(得分:1)
我认为您已经明白了object
和text()
错误的含义。您在第一个示例中获得的简单文本仍然是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>
结果
这是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]'
。