你會得到你想要的東西,如果你寫的XML的格式如下:
var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1"">
<empty></empty>
<space> </space>
<null xsi:nil=""true""/>
</document>";
正如你可以看到你想要爲空字符串寫爲<empty></empty>
,而不是<empty />
要序列化的節點。
的事情是,JSON.NET,用於序列化XML節點到JSON,採用XmlNodeConverter
類在其SerializeNode
方法檢查XmlElement
類的IsEmpty
屬性。你可以閱讀更多關於此屬性here。該決定null
或空的字符串是否被序列化時,上述方法的代碼段看起來是這樣的:
if (element.IsEmpty)
writer.WriteNull();
else
writer.WriteValue(string.Empty);
當XML片段是自閉(<empty/>
),該IsEmpty
屬性返回true,零被寫入json字符串,否則(<empty></empty>
),它返回false,string.empty寫入json字符串。
UPDATE 1:
此更新應該解決的問題中描述here。 (鏈接也可以在這個答案的評論中找到)。
爲了能夠序列不具有價值<empty></empty>
代替<empty/>
一個屬性,我們應該執行自定義XML序列化,所以Serializetest
類(在上面的鏈接提供)應該是這樣的:
[Serializable]
public class Serializetest : IXmlSerializable
{
public Serializetest()
{
Empty = string.Empty;
}
public string Empty { get; set; }
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
throw new NotImplementedException();
}
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Empty");
writer.WriteValue(Empty);
writer.WriteEndElement();
}
}
然後主要方法:
var serializetest = new Serializetest();
string xmlText;
var serializer = new XmlSerializer(typeof(Serializetest));
using (var textWriter = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(textWriter))
{
serializer.Serialize(xmlWriter, serializetest);
}
xmlText = textWriter.ToString();
}
var doc = new XmlDocument();
doc.LoadXml(xmlText);
var jsonText = JsonConvert.SerializeXmlNode(doc);
var json = JObject.Parse(jsonText);
var empty = (string)json.SelectToken("Serializetest.Empty");
// This should return empty string instead of null.
我敢肯定標準的.NET XML序列化的一個空字符串屬性產生但我要回去,明天上。 –
是的,但您可以重寫XML序列化以使其與JSON.NET結合使用。 –
代碼中描述的問題。 https://gist.github.com/jonelf/47e3a1b2f06b66983e29 –