4

ノード(文字列形式)をXElementにロードしようとしています。これは十分に簡単なはずですが、私はいくつかの問題を見つけています:

  • ロードしようとしているノードには、いくつかのサブノードに名前空間参照が含まれています
  • 使用しようとしたとき、XElement.Load()またはXelement.Parse()予期された未定義の名前空間エラーが発生したとき

解決策は、名前空間定義を使用して周囲のノードを作成し、すべてをロードすることですが、文字列操作を含まない、より洗練された解決策があるかどうか疑問に思いました。

これが私の失敗した試みです:(

名前空間属性のコレクションがあります:

private readonly List<XAttribute> _namespaces;

これはすでに入力されており、必要なすべての名前空間が含まれています。したがって、XML文字列を別のノードに埋め込むために、これを実行していました。

var temp = new XElement("root", (from ns in _namespaces select ns), MyXMLString);

しかし、私も予想したように、MyXMLStringのコンテンツはエスケープされ、テキストノードになります。私が得る結果は次のようなものです:

<root xmlns:mynamespace="http://mynamespace.com">&lt;mynamespace:node&gt;node text&lt;/node&gt;</root>

そして私が探している結果は次のとおりです。

<root xmlns:mynamespace="http://mynamespace.com">
<mynamespace:node>node text</node>
</root>

これを行うためのきちんとした方法はありますか?

前もって感謝します

4

1 に答える 1

5

おそらく、XMLテキストは実際には整形式です(終了タグの名前空間修飾子に注意してください)。

var xml = "<mynamespace:node>node text</mynamespace:node>";

この場合、これを使用して名前空間を手動で指定できます。

var mngr = new XmlNamespaceManager( new NameTable() );
mngr.AddNamespace( "mynamespace", "urn:ignore" ); // or proper URL
var parserContext = new XmlParserContext(null, mngr, null, XmlSpace.None, null);

今読んでロードします:

var txtReader = new XmlTextReader( xml, XmlNodeType.Element, parserContext );
var ele = XElement.Load( txtReader );

期待どおりに動作します。また、ラッパーの「ルート」ノードは必要ありません。これで、これをどこにでも挿入できますXElement

于 2012-05-05T08:08:16.660 に答える