2

我正在尝试构建一个 xpath 表达式来搜索位于[CDATA]下面标签中的特定文本,并返回它(注意:它们将是许多<Car>节点,所有节点都具有唯一的[CDATA]文本):

<Cars>
    <Car>
        <Value><![CDATA[Login]]></Value>
        <DifValue code="01"><![CDATA[Entrada al sistema]]></DifValue>
        <DifValue code="02"><![CDATA[ĐĂNG NHẬP]]></DifValue>
    </Car>
    <Car>
        .
        .
        .
    </car>
</Cars>

问题是我的表达对[CDATA]除 unicode “ĐĂNG NHẬP”以外的所有文本都有效(我只是在“targetText”中没有返回任何内容)

这是我到目前为止的简化片段:

Dim unicodeText as String = "ĐĂNG NHẬP"

unicodeText = unicodeText.ToLower()

Dim targetText as XmlNode = root.SelectSingleNode("//Cars/*/text()[translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') =""" + unicodeText + """]", namespaceManager)

有什么想法吗?

更新

虽然 JLRishe 确实有一个很好的解决方案(我接受了他的解决方案作为答案),但我确实提出了使用 RegEx 的自己的方法(可能不是最好的,但我只是分享):

Dim unicodeText as String = "ĐĂNG NHẬP"

unicodeText = unicodeText.ToLower();

Dim targetText as XmlNode = root.SelectSingleNode("//Car/text()[translate(., """ & unicodeText.ToUpper() & """, """ & unicodeText & """) =""" & unicodeText & """]", namespaceManager)
4

1 回答 1

2

XPath 的第一个问题是它只能找到Car具有您要查找的值的元素,而不是DifValue元素,因为Cars 是元素的唯一子Cars元素。

但即使你解决了这个问题,它仍然行不通,因为这种translate()方法只适用于 26 个字符 az,而不适用于带重音符号的字符(除非你列出了你需要能够处理的每个字符的大写和小写版本)。

在这种情况下,我建议使用 Linq-to-Xml(即XDocumentXElement类),因为它允许您在 .NET 代码中进行比较:

(注意:我假设您不会root使用 XML 文字进行实例化,但为了完整起见,我会将其放在示例中)

Dim root As XElement =
    <Cars>
        <Car>
            <Value><![CDATA[Login]]></Value>
            <DifValue code="01"><![CDATA[Entrada al sistema]]></DifValue>
            <DifValue code="02"><![CDATA[ĐĂNG NHẬP]]></DifValue>
        </Car>
        <Car>  . . .  </Car>
    </Cars>

Dim unicodeText As String = "đăng nhập"
Dim found As IEnumerable(Of XElement) =
    root.Descendants("Car").
         Elements().
         Where(Function(el) el.Value.Equals(unicodeText, 
                                         StringComparison.InvariantCultureIgnoreCase))
于 2013-02-08T12:22:12.603 回答