Java 检查VTD-XML中的XPath是否评估为XML标记(或)文本(或)标记列表(或)文本列表
将下面的XML示例结构作为输入。 我使用VTD-XML:2.11使用Java-8解析XML。这些场景就像我需要根据提供的XPath解析下面的XML,并返回一个包含XPath计算值的列表。在任何时候,需要解析的XML和XPath都不是固定的,每次我的解析都会有新的XML作为新XPath的输入Java 检查VTD-XML中的XPath是否评估为XML标记(或)文本(或)标记列表(或)文本列表,java,xml,xpath,vtd-xml,Java,Xml,Xpath,Vtd Xml,将下面的XML示例结构作为输入。 我使用VTD-XML:2.11使用Java-8解析XML。这些场景就像我需要根据提供的XPath解析下面的XML,并返回一个包含XPath计算值的列表。在任何时候,需要解析的XML和XPath都不是固定的,每次我的解析都会有新的XML作为新XPath的输入 Ex1: XPath: //CATALOG/CD/TITLE/text() output: - Empire Burlesque - Still got the blues
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>
请让我知道是否有人希望我添加额外的信息以完全理解我的问题。我认为您对
text()
和xml元素的含义理解错误。第一个示例中得到的简单文本仍然是XML..,尽管它缺少任何标记
我不知道这是否与您相关,但请想象一个嵌套结构,如下所示:
<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>
<CATALOG>
<CD Titel="Some title" Artist="Some artist" ... more attriubtes ... />
</CATALOG>
工作示例(但不在工具中)
DECLARE@tbl表(YourXml);
插入@tbl值
(不适用)
皇帝讽刺剧
')
,(N'
还是那么忧郁吗
')
,(N'
隐藏你的心
');
选择您的xml.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)'))
来自@tbl;
结果
这是T-SQL
,但是您可以看到,我调用了.query()
两次,一次使用text()
调用,另一次不使用。一个返回裸文本(但仍然是XML),一个返回
标记中的文本。.value()
带有'(//text())[1]
的XPath
,
将返回找到的第一个text()
。<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;