反序列化包含嵌入的xhtml元素的XML

时间:2017-06-21 17:40:05

标签: c# xml linq-to-xml xml-deserialization

我正在接收包含嵌入式xhtml的xml。

我想将DocBody元素作为包含所有xhtml的字符串返回,但不知道xhtml是如何包含在xml中的。我还没有看到很多如何做到这一点的例子。

我通过API收到此结果,因此无法修改XML。

<Documents xmlns="http://mycompany.com/api/v2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <Document>
        <Content i:type="CreditAnalystNote">
            <DocBody>
                <xhtml>
                    <p>
                        Paragrah 1 html.
                    </p>
                    <p>
                        Paragrah 2 html.
                    </p>
                    <p>
                        Paragrah 3 html.
                    </p>
                    <p>
                        Paragrah 4 html.
                    </p>
                </xhtml>
            </DocBody>
        </Content>
    </Document>
</Documents>

我用来反序列化XML的类如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;

namespace Corporate
{
    [Serializable]
    [XmlRoot(ElementName = "Documents", Namespace = "http://cms.mycompany.com/api/v2")]
    public class RPSShareclassDocuments
    {
        [XmlElement(ElementName = "Document")]
        public List<ShareClassDocumentData> DocumentData { get; set; }
    }

    [Serializable]
    public class ShareClassDocumentData
    {
        [XmlElement("Content")]
        public DocumentShareClassData CreditNote { get; set; }
    }

    [XmlType("CreditAnalystNote")]
    public class DocumentShareClassData
    {
        [XmlElement]
        public string DocBody { get; set; }
    }
}

我正在尝试使用以下内容反序列化文本:

XDocument xDocResult = new XDocument();
xDocResult = ... (gets content into an XDocument)

IXmlUtils xmlUtility = new XmlUtils();
RPSShareclassDocuments document = xmlUtility.Deserialize<RPSShareclassDocuments>(xDocResult);

和反序列化方法是:

    public T Deserialize<T>(XDocument doc)
    {

        string szNamespace = doc.Root.Name.Namespace.NamespaceName;

        XmlSerializer serializer = new XmlSerializer(typeof(T), szNamespace);
        T result;
        using (System.Xml.XmlReader reader = doc.CreateReader())
        {
            result = (T)serializer.Deserialize(reader);
        }

        return result;
    }

编辑1 我能弄清楚如何从XML中提取XHTML的唯一方法是使用以下代码,尽管这不是我所希望的。

            xDocResult = restClient.RestGET(szCurrentSecurityAPI);

        XNamespace ns = xDocResult.Root.Name.Namespace.NamespaceName;
        XElement xdb = xDocResult.Root.Element(ns + "Document").Element(ns + "Content").Element(ns + "DocBody").Element(ns + "xhtml");

如果有更好的选择,例如直接从XDocument或XSLT中提取信息,我也会感兴趣。

0 个答案:

没有答案