※ ChatGPTを利用し、要約された質問です(原文:XMLDocumentでスキーマを無視して取得)
XMLDocument.LoadXmlでスキーマを無視して取得
このQ&Aのポイント
XMLDocument.LoadXmlを使用して、XML文字列を読み込む方法について質問しています。
DBに格納されたデータを文字列に変換し、XML文字列の要素を階層を維持したままDataSetやHashTableに格納したいとのことです。
既存のXML操作にはXmlReadMode.InferSchemaが利用できますが、XML文字列から値を取得するためにXMLDocumentを使用している中で、スキーマを無視して要素を取得する方法を探しています。
XMLDocument.LoadXmlを使用して、XML文字列を読み込もうとしています。
■以下のことを行おうとしています。
1.DBに格納されたデータ(Byte配列)をStringの文字列に変換。
※文字列にする理由…ディスク領域にファイル出力などは行わずに行いたい為。
2.XML文字列の要素(タグ)を<HOGE>~</HOGE>の構造を階層を維持したまま
DataSetや、HashTableに格納したい。
例)
<?xml version="1.0" standalone="yes"?>
<xs:schema id="testDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<HOGE>
<TEST1>
<SUBTEST1>あいうえお</SUBTEST1>
</TEST1>
<TEST2>
<SUBTEST2>かきくけこ</SUBTEST2>
</TEST2>
</HOGE>
※2行目の<xs:schema~のスキーマ部分は無視して、HOGEブロック内だけの要素を取り出したい。
※また格納したDatasetなどから、SUBTEST1などの要素名を指定して
「あいうえお」の値を取得したい。
■対応
上記を実現するために、XMLDocument.LoadXMLを使用しました。
XMLDocument.LoadXML(★上記の例の文字列をString変数に格納しで指定★)
ですが、上記のようにすると
「ルート要素が見つかりません」旨のエラーが出て煮詰まっております。
DataSetのReadXML等だと、XmlReadModeなるものが使用でき、
ReadXMLに引数としてXmlReadMode.InferSchemaを指定すると、
インラインスキーマを無視した要素取得ができるようですが、
今回はXML文字列からの値取得が大前提の為、XMLDocumentを使用している次第です。
XMLDocumentでも、DataSet.ReadXMLのようにスキーマ部分を無視して、
XML文字列を何らかの配列に格納し、要素検索ができる形を行いたいです。
XML文字列をString変数に格納後に、スキーマ部分だけ除外して読み込む方法も考えたのですが
XMLの構造体が常に例と同じ構造で来る訳ではないので、文字列操作ではなく
XMLDocument「スキーマを読まないで要素を取得する方法」があればと思い投稿しました。
自身でもあと1日調査する猶予があるのですが、残された時間が時間の為
何か少しでも良い方法や案をご存知の方おられましたら、
ご教授願いますでしょうか。
よろしくお願いいたします。
お礼
ありがとうございます。
補足
> 正規表現でも使ってスキーマの行を削除 ありがとうございます。上記の方法も検討してみます。