- 題名: XMLパーサーの大文字小文字解析について
- 日時: 2009/05/25 10:27:30
- ID: 24614
- この記事の返信元:
- (なし)
- この記事への返信:
- [24616] Re[1]: XMLパーサーの大文字小文字解析について2009/05/25 12:04:58
- ツリーを表示
■No24614に返信(RUNNEさんの記事)
> 検索される方のXMLも大文字・小文字が入り乱れた中で、
> 2ノードを取得する方法は存在するのでしょうか?
2008 で良いのかな?
Imports System
Module Test
Sub Main()
'Dim doc = <aaa><bbb value='AbcD'></bbb><bbb value='aBCd'></bbb><bbb value='test'/></aaa>
'Dim nodes = From n In doc.<bbb> Where UCase(n.@value) = "ABCD"
Dim doc As XDocument = XDocument.Parse("<aaa><bbb value='AbcD'></bbb><bbb value='aBCd'></bbb></aaa>")
Dim nodes = From n In doc.<aaa>.<bbb> Where UCase(n.@value) = "ABCD"
For Each n In nodes
Console.WriteLine( n )
Next
End Sub
End Module
■No24616に追記(魔界の仮面弁士の記事)
>>検索される方のXMLも大文字・小文字が入り乱れた中で、
>>2ノードを取得する方法は存在するのでしょうか?
> 2008 で良いのかな?
.NET 3.5 未満の環境でも動作するよう、XLinq を使わない記法にしてみました。
XPath 関数の「translate」で大文字化しています。
(MSXML なら、ms:string-compare 関数が使えるのだけれども…)
http://msdn.microsoft.com/ja-jp/library/ms256138.aspx
Imports System
Imports System.Text
Imports System.Xml
Imports Microsoft.VisualBasic
Module Test
Sub Main()
Dim sb As New StringBuilder()
For c As Integer = AscW("a"c) To AscW("z"c)
sb.Append(ChrW(c))
Next
Dim doc As New XmlDocument()
doc.LoadXml("<aaa><bbb value='AbcD'></bbb><bbb value='aBCd'></bbb></aaa>")
Dim XPath As String = String.Format("/aaa/bbb[translate(@value, '{1}', '{2}') = '{0}']", _
"ABCD", sb.ToString(), UCase(sb.ToString()))
For Each node As XmlElement In doc.SelectNodes(XPath)
Console.WriteLine(node.OuterXml)
Next
End Sub
End Module
あるいは XPath だけに頼るのではなく、
For Each attr As XmlAttribute In doc.SelectNodes("/aaa/bbb/@value")
If UCase(attr.Value) = "ABCD" Then
Dim node As XmlNode = attr.OwnerElement
Console.WriteLine(node.OuterXml)
End If
Next
のように、VB コードと併用するとか。
分類:[.NET]
<aaa>
<bbb value='AbcD'></bbb>
<bbb value='aBCd'></bbb>
</aaa>
↑のようにaaa/bbbのinnerTextにabcdと設定されているのですが、
XPathでは、大文字・小文字を判定してしまうため、
aaa/bbb[@value='AbcD']と明確に指定しなければ、ノードを取得できません。
aaa/bbb[@value='aBCd']と検索の方も大文字・小文字が入り乱れ、
検索される方のXMLも大文字・小文字が入り乱れた中で、
2ノードを取得する方法は存在するのでしょうか?
よろしくお願い致します。