解码 xml 中的 cdata 内容

发布于 2024-12-03 03:02:35 字数 178 浏览 2 评论 0原文

客户向我们发送了一个 XML 文件,其中包含 XML 编码的 CDATA 内容 即 <![CDATA[some content]]>

在 asp.net 中用解码版本替换 XML 文件中的内容的最佳方法是什么? (无需要求客户向我们发送正确的文件)

谢谢

A customer has sent us an XML file with CDATA content that is XML encoded
i.e. <![CDATA[some content]]>

What is the best way in asp.net to replace the content in the XML file with a decoded version? (without asking the customer to send us a correct file)

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扶醉桌前 2024-12-10 03:02:35

这可能不是您正在寻找的,但它至少会给您一个开始:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Security;

namespace CSSandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            string oldXml = "<root><child>No CDATA here</child><child><![CDATA[Illegal xml & <> '' bobby tables]]></child><child><child><![CDATA[More CDATA &&&]]></child></child></root>";
            Console.WriteLine(oldXml);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(oldXml);

            ProcessNodes(doc, doc.ChildNodes);

            string newXml = doc.OuterXml;
            Console.WriteLine(newXml);

            Console.ReadLine();
        }
        static void ProcessNodes(XmlDocument doc, XmlNodeList nodes)
        {
            foreach (XmlNode node in nodes)
            {
                if (node.HasChildNodes)
                {
                    ProcessNodes(doc, node.ChildNodes);
                }
                else
                {
                    if (node is XmlCDataSection)
                    {
                        string cdataText = node.InnerText;
                        node.ParentNode.InnerXml = SecurityElement.Escape(cdataText);
                    }
                }
            }
        }
    }
}

这假设您的 cdata 块是当前节点的唯一子节点(根据我的测试)。

This might not be what you are looking for, but it will at least give you a start:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Security;

namespace CSSandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            string oldXml = "<root><child>No CDATA here</child><child><![CDATA[Illegal xml & <> '' bobby tables]]></child><child><child><![CDATA[More CDATA &&&]]></child></child></root>";
            Console.WriteLine(oldXml);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(oldXml);

            ProcessNodes(doc, doc.ChildNodes);

            string newXml = doc.OuterXml;
            Console.WriteLine(newXml);

            Console.ReadLine();
        }
        static void ProcessNodes(XmlDocument doc, XmlNodeList nodes)
        {
            foreach (XmlNode node in nodes)
            {
                if (node.HasChildNodes)
                {
                    ProcessNodes(doc, node.ChildNodes);
                }
                else
                {
                    if (node is XmlCDataSection)
                    {
                        string cdataText = node.InnerText;
                        node.ParentNode.InnerXml = SecurityElement.Escape(cdataText);
                    }
                }
            }
        }
    }
}

This assumes that your cdata block is the only child of the current node (as per my test).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文