none
「0」から始まる要素があるXMLファイルをSystem.Xml.XmlDocumentに読み込む方法 RRS feed

  • 質問

  • いつもお世話になります。

    XmlDocumentについて皆様のお知恵を拝借できたらと思い投稿させていただきました。

     

    下記のようにXMLをLoadしています。

    Dim xdoc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
    
    xdoc.Load("test.xml")
    
    
    

    しかし、このtest.xmlは下記のように「0」などの数字から始まる要素が含まれています。

    <root>
     <001>
     </001>
     <002>
     </002>
    </root>
    
    

    その場合、Loadで下記のようなエラーが発生してXMLを読み込むことができません。

    Name cannot begin with the '0' character

    XMLの仕様に反しているため当然なのですが、もしこのように数字から始まる要素を持つXMLファイルでもXmlDocumentに読み込む方法があればご教示いただけたら幸いです。

     

    よろしくお願いいたします。

     

    2011年12月21日 7:29

回答

  • XmlReaderSettings.CheckCharacters の解説にはそれらしいことが書かれてますが、実際には要素名のチェックは強制的に行われるようですね。

    XmlDocument にロードする前に、正規表現かなんかで置換(</?[0-9] を </?__[0-9] みたいな形に)してしまうのが一番手っ取り早いのではないでしょうか。ファイルに対して手作業でも、StreamReader.ReadToEnd した後で Regex.Replace とかでも。

    • 回答としてマーク MSDN-TK 2011年12月22日 4:11
    2011年12月21日 8:00

すべての返信

  • XmlReaderSettings.CheckCharacters の解説にはそれらしいことが書かれてますが、実際には要素名のチェックは強制的に行われるようですね。

    XmlDocument にロードする前に、正規表現かなんかで置換(</?[0-9] を </?__[0-9] みたいな形に)してしまうのが一番手っ取り早いのではないでしょうか。ファイルに対して手作業でも、StreamReader.ReadToEnd した後で Regex.Replace とかでも。

    • 回答としてマーク MSDN-TK 2011年12月22日 4:11
    2011年12月21日 8:00

  •  Hongliang様

    お返事をまことに恐れ入ります。

    やはりその方法がベストのようですね。

     

    下記のようにしてみました。 

            Dim sr As StreamReader = New StreamReader("test.xml")
            Dim x As String = Regex.Replace(sr.ReadToEnd(), "(</?)([0-9])", "$1aaa$2")
            sr.Close()
    
            Dim xmldoc As XmlDocument = New XmlDocument()
            xmldoc.LoadXml(x)
    
    

     

    こうすることで、test.xmlが

    <root>
     <001>
     </001>
     <002>
     </002>
    </root>
    
    
    

    から

    <root>
     <aaa001>
     </aaa001>
     <aaa002>
     </aaa002>
    </root>
    
    
    

     に変換されてXmlDocumentに読み込まれました。

    XMLのサイズによっては Regex.Replaceのところで若干時間がかかりますので、素直に手修正したXMLファイルを使用した方がよい場合もありそうです。

     

     どうもありがとうございました。

     

    2011年12月22日 4:11