Как я могу использовать CDATA с сгенерированными классами C # из xsd.exe? - PullRequest
0 голосов
/ 16 мая 2018

Задача

В данный момент я пытаюсь заполнить раздел, который сопоставляется с xs:string, и записать его в XML.

Я поместил сгенерированный код этого значения внизу этого поста, так как он немного длинный.

Ранее я просто присвоил ей строковое значение.

rawdata.data = generatedString;

Но когда я попробовал это.

rawdata.data = "<![CDATA[" + generatedString + "]]>";

Возможный вывод форматирует часть CDATA в любом случае.

&lt;![CDATA[

Есть ли какой-нибудь способ, которым я могу избежать этого, чтобы CDATA отображался в том виде, в каком он предназначен?

Дополнительная информация

Сгенерированный код для этого поля.

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DataFilesRawdata
{

    private string idField;

    private string dataField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string ID
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string data
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Ответ @SeM - это то, что, я думаю, является наиболее правильным решением в зависимости от того, как Microsoft создала сериализатор XML, но, поскольку мне нужно восстановить классы из XSD относительно , часто я решал, что лучше попробовать чтобы найти другое решение вместо того, чтобы вручную редактировать сгенерированные классы после каждой сборки.

В этом ключе я обнаружил, что вместо изменения сгенерированных классов я мог бы переопределить XmlSerializer, чтобы, если он сталкивался с контентом CDATA, он мог с ним справиться.

Конечно, это работает, только если CDATA находится в самом начале и в самом конце элемента. В этом отношении он подходит для моего варианта использования, но не всегда обеспечивает все варианты использования.

using (var fileStream = new System.IO.FileStream(tempFilePath,FileMode.Create))
{                
    var xmlwriter = new CustomXmlTextWriter(fileStream);
    xmls.Serialize(xmlwriter, contents, ns);
}

И пользовательский писатель.

public class CustomXmlTextWriter : XmlTextWriter
{

    //... constructor if you need it

    public override void WriteString(string text)
    {
        if (text.StartsWith("<![CDATA[") && text.EndsWith("]]>"))
        {
            base.WriteRaw(text);
            return;
        }
        base.WriteString(text);
    }

}

Похоже, это то же самое, что и Microsoft.

https://referencesource.microsoft.com/#SMDiagnostics/System/ServiceModel/Diagnostics/PlainXmlWriter.cs,137

0 голосов
/ 16 мая 2018

Используйте XmlCDataSection для этого:

[XmlElement("data")]
public System.Xml.XmlCDataSection Data { get; set; }

это автоматически создаст секции CData в вашем xml, если вы сериализуете ваш объект.

Назначьте это:

rawdata.data = System.Xml.XmlDocument().CreateCDataSection(generatedString);
...