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

check XPath in VTD-XML is evaluating to XML Tag (or) Text (or) List of Tag (or) list of Text

考虑以下 XML 示例结构作为输入。 我正在使用 VTD-XML:2.11 使用 Java-8 解析 XML。这些场景就像我需要根据提供的 XPath 和 return 解析下面的 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>

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

注意:我不想检查给定的 XPath 是否以“text()”结尾来了解 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>

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

我认为您理解错了 text()xml element 的意思。您在第一个示例中获得的简单文本仍然是 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>

没有 text() 的 XPath 将 return 里面的所有东西。您甚至需要 text()[1]text()[2] 来获取两个现有的文本部分。

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

提示

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

<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() 两次,一次是 text(),另一次是没有。一个 return 是裸文本(但仍然是 XML),一个 return 是 <TITLE> 标签内的文本。具有 '(//text())[1]'XPath.value() 将 return 第一个 text() 无论在哪里被发现。

VTD-XML 的 VTDNav 对象允许您使用其 getTokenType() 方法调用来检查令牌的身份....这是您要找的吗?