我正在ASMX Webservice(Legacy .NET SOAP Service)中对XML文档进行一些预处理,以便最终在Silverlight前端使用。
我正在将该XML文档处理为POCO对象以便于使用。该对象定义如下:
public class CACDocument : ITextDocument
{
#region Properties
public string Title { get; set; }
public string Text { get; set; }
public List<Code> CodeList { get; set; }
public XElement FormatedText { get; set; }
#endregion
#region Constructor
public CACDocument()
{
CodeList = new List<Code>();
}
#endregion
}
该对象中的Text属性包含基本格式化的文本(换行符,空格等等)。提供该属性的XML节点如下所示:
<text>
A TITLE FOLLOWED BY two line breaks
Some text followed by a line break
Some more text that might extend for a paragraph or two followed by more line breaks
Still more text
</text>
一切都很好,格式保持正如我所期望的那样,Web服务序列化要发送到前端的数据。我猜测在尝试优化带宽时,序列化对象会在发送之前从Text属性中删除额外的空格和换行符。在这个特定的例子中,格式化很重要。有没有办法强制Web服务维护这种空格/换行格式?
我想我用代码替换了一些编码来查找有问题的项目,然后转换回前端,但这让我觉得有点像kludge。
答案 0 :(得分:5)
您可以将其序列化为CDATA部分:
[XmlIgnore]
public string Text { get; set; }
private static readonly XmlDocument _xmlDoc = new XmlDocument();
[XmlElement("Text")]
public XmlCDataSection TextCData
{
get
{
return _xmlDoc.CreateCDataSection(Text);
}
set
{
Text = value.Data;
}
}
文本将被序列化:
<text><![CDATA[A TITLE FOLLOWED BY two line breaks
Some text followed by a line break
Some more text that might extend for a paragraph or two followed by more line breaks
Still more text]]></text>
答案 1 :(得分:2)
我认为你指的是ASMX网络服务?
实际上,如果没有作为字节数组进行序列化,我认为没有办法做到这一点。或者,您可以实现IXmlSerializable并自己完成所有工作。
你会想要这样的东西:
public class CACDocument : ITextDocument {
// ...
[XmlIgnore]
public string Text {get;set;}
[XmlText]
public byte[] TextSubstitute {
get {return System.Text.Encoding.UTF8.GetBytes(Text);}
set {Text = System.Text.Encoding.UTF8.GetString(value);}
}
}
没有经过测试,但你会明白这一点。您也可以使用[XmlElement]而不是[XmlText],并指定不同的元素名称。