- 題名: 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ノードを取得する方法は存在するのでしょうか?
よろしくお願い致します。