假设我有像这样的xml结构
<root>
<element>some content</element>
<element>some content 2</element>
<element>some content 3</element>
<element>some content 4</element>
<element>some content 5</element>
<element>some content 6</element>
<element>some content 7</element>
<element>some content 8</element>
<element>some content 9</element>
<element>some content 10</element>
</root>
我在根目录中有很多标签,比方说1000,而且每个标签当然包含不同的数据(不是唯一的),我的问题是......如何查找元素数量的最快方法是什么,例如,如果我使用元素“some content 8”我想得到8号,我知道xpath可能是正确的工具,但在我看来它很慢(我想在几秒钟内做到这一点,因为我经常使用它)
也许有些“vim”方式怎么做?
谢谢
答案 0 :(得分:2)
您可以计算<element>
的替代品从第一行到当前行的所有时间:
:0,.s/<element>//gn
请注意,n
标志会阻止替换实际发生。
这显然不适用于所有可能的XML类型,但可能适合您的数据。
答案 1 :(得分:0)
要从当前行中提取数字,您可以在vim中使用以下ex命令:
:echo substitute(getline('.'), '.*\(\d\+\).*', '\1', '')
答案 2 :(得分:0)
纯XPath解决方案:
count(/*/element[. = 'some content 8']/preceding-sibling::*) +1
要轻松验证这一点,您可以使用 XPath Visualizer 等工具,或以下基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:value-of select=
"count(/*/element[. = 'some content 8']/preceding-sibling::*) +1"/>
</xsl:template>
</xsl:stylesheet>
对提供的XML文档执行此转换:
<root>
<element>some content</element>
<element>some content 2</element>
<element>some content 3</element>
<element>some content 4</element>
<element>some content 5</element>
<element>some content 6</element>
<element>some content 7</element>
<element>some content 8</element>
<element>some content 9</element>
<element>some content 10</element>
</root>
输出评估XPath表达式的结果,并且它是正确的:
8