我正在尝试构建一个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)
答案 0 :(得分:2)
您的XPath的第一个问题是它只会找到您要查找的值的Car
元素,而不是DifValue
元素,因为Car
s是唯一的子元素Cars
元素。
但即使你修复了它,它仍然无法工作,因为translate()
方法仅适用于26个字符az,而不适用于带重音的字符(除非你列出每个的大写和小写版本) 你需要能够处理的角色。)
在这种情况下,我建议使用Linq-to-Xml(即XDocument
和XElement
类),因为它允许你在.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))