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]ユニコード「ĐĂ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 の最初の問題は、 s が要素の唯一の子であるため、要素でCarはなく、探している値を持つ要素のみを見つけることです。 DifValueCarCars

しかし、それを修正しても、そのtranslate()アプローチはアクセント付きの文字ではなく 26 文字の az に対してのみ機能するため、まだ機能しません (処理できるようにする必要があるすべての文字の大文字と小文字のバージョンをリストしない限り)。

この場合、Linq-to-Xml (つまり、XDocumentandXElementクラス) を使用することをお勧めします。これにより、.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 に答える