2

それで、私は巨大なXMLファイルを持っており、すべてのCDATAセクションを削除し、CDATAノードの内容を安全なhtmlエンコードされたテキストノードに置き換えたいと思います。

もちろん、正規表現を使用してCDATAを削除するだけで、解析が中断されます。CDATAをエンコードされたテキストと交換するためのLINQ、XmlDocument、またはXmlTextWriterの手法はありますか?

私はまだ最終的なエンコーディングにはあまり関心がありません。セクションを自分の選択したエンコーディングに置き換える方法だけです。

元の例

  ---
  <COLLECTION type="presentation" autoplay="false">
    <TITLE><![CDATA[Rights & Responsibilities]]></TITLE>
    <ITEM id="2802725d-dbac-e011-bcd6-005056af18ff" presenterGender="male">
      <TITLE><![CDATA[Watch the demo]]></TITLE>
      <LINK><![CDATA[_assets/2302725d-dbac-e011-bcd6-005056af18ff/presentation/presentation-00000000.mp4]]></LINK>
    </ITEM>
  </COLLECTION>
  ---

なるだろう

          <COLLECTION type="presentation" autoplay="false">
            <TITLE>Rights &amp; Responsibilities</TITLE>
            <ITEM id="2802725d-dbac-e011-bcd6-005056af18ff" presenterGender="male">
              <TITLE>Watch the demo</TITLE>
              <LINK>_assets/2302725d-dbac-e011-bcd6-005056af18ff/presentation/presentation-00000000.mp4</LINK>
            </ITEM>
          </COLLECTION>

最終的な目標はJSONに移行することだと思います。私はこれを試しました

            XmlDocument doc = new XmlDocument();
            doc.Load(Server.MapPath( @"~/somefile.xml"));
            string jsonText = JsonConvert.SerializeXmlNode(doc);

しかし、私は醜いノード、つまり「#cdata-section」キーになってしまいます。これを受け入れるためにフロントエンドを再開発するには、WAAAAYに何時間もかかります。

"COLLECTION":[{"@type":"whitepaper","TITLE":{"#cdata-section":"SUPPORTING DOCUMENTS"}},{"@type":"presentation","@autoplay":"false","TITLE":{"#cdata-section":"Demo Presentation"},"ITEM":{"@id":"2802725d-dbac-e011-bcd6-005056af18ff","@presenterGender":"male","TITLE":{"#cdata-section":"Watch the demo"},"LINK":{"#cdata-section":"_assets/2302725d-dbac-e011-bcd6-005056af18ff/presentation/presentation-00000000.mp4"}
4

3 に答える 3

5

入力を出力にコピーするだけのXSLTでXMLを処理します-C#コード:

  XslCompiledTransform transform = new XslCompiledTransform();
  transform.Load(@"c:\temp\id.xslt");
  transform.Transform(@"c:\temp\cdata.xml", @"c:\temp\clean.xml");

id.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
于 2012-05-10T23:38:37.057 に答える
4

LINQ to XMLを使用すると、次のように実行できます。

XDocument doc = …;

var cDataNodes = doc.DescendantNodes().OfType<XCData>().ToArray();

foreach (var cDataNode in cDataNodes)
    cDataNode.ReplaceWith(new XText(cDataNode));
于 2012-05-10T23:56:44.537 に答える
0

XmlDocumentxmlをクラスにロードできると思います。次に、それぞれを再帰的に処理し、ノードXmlNodeを探しXmlCDataSectionます。このノードは同じ値XmlCDataSectionに置き換える必要があります。XmlTextNode

于 2012-05-10T23:47:47.577 に答える