检查 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() 方法调用来检查令牌的身份....这是您要找的吗?
考虑以下 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() 方法调用来检查令牌的身份....这是您要找的吗?