gpt4 book ai didi

c# - 如何让 Json.NET 将空 XML 元素序列化为空字符串

转载 作者:行者123 更新时间:2023-11-30 14:55:52 24 4
gpt4 key购买 nike

release notes对于 Json.NET 6.0 Release 3 状态

Change - Blank XML elements will be written as an empty string instead of null

但这不是我的经验。

var xmlText = @"<document xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.1"">
<empty/>
<space> </space>
<null xsi:nil=""true""/>
</document>";
var doc = new XmlDocument();
doc.LoadXml(xmlText);
var jsonText = JsonConvert.SerializeXmlNode(doc);

我以为

"empty":"", "space":" ", "null":{"@xsi:nil":"true"}

但是得到了

"empty":null, "space":"", "null":{"@xsi:nil":"true"}

丢失的空间现在不是问题,但我真的很喜欢将空 XML 元素序列化为“”而不是 null。这可能吗?

最佳答案

如果您按照以下格式编写 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 中的类方法检查 IsEmpty XmlElement 的属性(property)类(class)。您可以阅读有关此属性的更多信息 here .上述方法判断是否为null的代码段或者空字符串被序列化,看起来像这样:

if (element.IsEmpty)
writer.WriteNull();
else
writer.WriteValue(string.Empty);

当 xml 片段自闭(<empty/>)时,IsEmpty property返回true,null写入json字符串,否则(<empty></empty>),返回false,string.empty写入json字符串。

更新 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.

关于c# - 如何让 Json.NET 将空 XML 元素序列化为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24368006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com