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

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

将下面的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
         - 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()

谢谢您的及时回复。正如我在问题中提到的,我在XML中没有任何控制权。我可以接收任何XML结构的任何类型的XML。我的问题与VTD-XMLJava库函数有关,该函数用于检查所计算的XPath是否有任何文本/标记。虽然我理解了你关于“text()也是XML”的观点。我会看看我的代码是否以同样的方式对两者都有效。但是任何额外的建议都非常感谢。@GhostRider查看我的更新,希望这能帮助。。。至少它应该指向方向真的谢谢你的更新。但是我所寻找的是Java代码的特定部分,我不能使用任何其他工具/语言(比如您指定的T-Sql)。我可以使用普通的XSLT来实现这一点,这将不符合我的要求。我给你们一个向上投票的机会,让我的问题没有得到回答,这样其他人就可以给出针对JavaVTD-XML库的答案。再次感谢你是的。我想这可能会解决我的问题。但是“vNav.getTokenType(vNav.getCurrentIndex())”正在返回一个“int”值。如果我在xpath中指向“./text()”,则返回“5”。如果我指向一个xml元素,则返回“0”。/TITLE。是否有一个常数列表,我可以指出这些整数值。类似于“VTDNav.NC/NS/P/R..etc”,但请考虑光标导航到的所有轴,是否有第一个子(FC)、最后一个子(LC)、下一个同级(NS)、上一个同级(ps)和父级(P)。。。
<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;