1

したがって、私が最終的にやろうとしているのは、XMLを解析し、cdataセクション内に含まれる要素に要素値を追加することです。xml内のcdataセクションを検索し、それを引き出して別のxdocumentにロードし、xml構造を維持してから、要素値を追加しますが、元のxmlに戻す方法がわかりません。元の位置。

これが元のXMlです。

  <OUTPUT version="2.0"><RESPONSE><DATA state="FL" city="Sarasota">
      <![CDATA[<LION xmlns="http://www.com" version="5.050">
      <COMMENTS>
        <PLACES>   
          Forest under a tree
         </PLACES></COMMENTS></LION>]]>
   </DATA></RESPONSE></OUTPUT>

cdataセクションを検索し、次のような要素値を挿入します。

XDocument value = XDocument.Parse(returnValue);
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"\<\!\[CDATA\[(?<text>[^\]]*)\]\]\>", options);

bool isMatch = regex.IsMatch(returnValue);
if(isMatch)
{
  Match match = regex.Match(returnValue);                   
  string HTMLtext = match.Groups["text"].Value;
  XDocument cdata = XDocument.Parse(HTMLtext);
  XNamespace ns = @"http://www";
  var com = cdata.Descendants(ns + "COMMENTS").First();
  var dcomm = com.Element(ns + "PLACES");
  dcomm.Value = "test"+ dcomm.Value;

私が残したのは、正規表現を文字列に変換して削除されたため、cdataテキストに追加し直してから、元のxmlのcdataの位置に戻すことです。

4

1 に答える 1

0

NodeTypeプロパティを使用して正規表現を使用せずに、ノードがcdataであるかどうかをテストできます。この例では、テストするためにXCDataにキャストしようとします。

 XElement root = XElement.Parse(input);
                XElement dataElement = root.Descendants("DATA").FirstOrDefault();
                XCData cdata = dataElement == null ? null : dataElement.FirstNode as XCData;
                if (cdata == null)
                {
                    return;
                }

                XElement nestedXml = XElement.Parse(cdata.Value);
                XNamespace ns = @"http://www.com";
                var com = nestedXml.Descendants(ns + "PLACES").First();

                com.Value = "Incomplete App Email sent to member." + com.Value;

                cdata.Value = nestedXml.ToString(SaveOptions.DisableFormatting);
                string updatedOutput = cdata.ToString();
于 2013-01-09T03:18:55.237 に答える