0

純粋なテキストだけでなく、いくつかの XML ノードも含む可能性のあるテストを XElement に入力する最良の方法は何ですか?

たとえば、このコード

XElement el = new XElement("XML_NODE");
el.Value = "some text <TAG>with custom tag value</TAG>";
string xml = el.ToString();

xml を として返し<XML_NODE>some text &lt;TAG&gt;with custom tag value&lt;/TAG&gt;</XML_NODE>ます。何が起こっているのか、なぜそれが起こったのかを理解しています。しかし、それはまさに私が望むものではありません...<XML_NODE>some text <TAG>with custom tag value</TAG></XML_NODE>内側の括弧が引用されていない、これに似たxmlを取得したいと思います。

次のコードで目的の結果を得ることができます

XElement el2 = XElement.Parse("<XML_NODE>some text <TAG>with custom tag value</TAG></XML_NODE>");
xml = el2.ToString();

しかし、XML を文字列として構築し、後で解析するという考えは好きではありません。

他に取得する良い方法はありますか?

4

2 に答える 2

3

もう少し効率的な別の方法:

static IEnumerable<XNode> ParseNodes(string value)
{
   var settings = new XmlReaderSettings 
   { 
      ConformanceLevel = ConformanceLevel.Fragment 
   };

   using (var sr = new StringReader(value))
   using (var xr = XmlReader.Create(sr, settings))
   {
      xr.Read();
      while (xr.ReadState != ReadState.EndOfFile)
      {
         yield return XNode.ReadFrom(xr);
      }
   }
}

string text = "some text <TAG>with custom tag value</TAG>";
var node = new XElement("XML_NODE", ParseNodes(text));
于 2013-01-23T15:38:12.837 に答える
1

コメントで言ったように、本当に良い方法はありません。しかし、この「あまり良くない」方法をカプセル化することもできます。

public IEnumerable<XNode> ParsePartial(string partialXml)
{
    return XElement.Parse(string.Format("<tmp>{0}</tmp>", partialXml)).Nodes();
}

var el3 = new XElement("XML_NODE",
                       ParsePartial("some text <TAG>with custom value</TAG>"));
于 2013-01-23T15:11:30.427 に答える