VB.Net中的XPath表达式 - 如何搜索包含unicode字符的xml文档

时间:2013-02-08 10:56:59

标签: asp.net xml vb.net xpath

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

<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“ĐĂNGNHẬP”(我只是在“targetText”中返回Nothing)

以下是我到目前为止的简化摘录:

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)

1 个答案:

答案 0 :(得分:2)

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

但即使你修复了它,它仍然无法工作,因为translate()方法仅适用于26个字符az,而不适用于带重音的字符(除非你列出每个的大写和小写版本) 你需要能够处理的角色。)

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

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

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))