gpt4 book ai didi

c# - 将命名空间添加到序列化的 xml

转载 作者:行者123 更新时间:2023-12-04 16:59:31 25 4
gpt4 key购买 nike

我在 xml 序列化方面遇到了一个非常讨厌的问题 - 我需要向生成的 xml 文件添加一些特殊信息:

目前,它看起来像

<?xml version="1.0" encoding="iso-8859-1"?>
<ORDER_LIST>
<ORDER version="1.0" xmlns="http://www.opentrans.org/XMLSchema/1.0">... shortened ...</ORDER>
<ORDER version="1.0" xmlns="http://www.opentrans.org/XMLSchema/1.0">... shortened ...</ORDER>
<ORDER version="1.0" xmlns="http://www.opentrans.org/XMLSchema/1.0">... shortened ...</ORDER>
</ORDER_LIST>

但它应该看起来像
<?xml version="1.0" encoding="iso-8859-1"?>
<ORDER_LIST>
<ORDER xmlns="http://www.opentrans.org/XMLSchema/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opentrans.org/XMLSchema/1.0 openTRANS_ORDER_1_0_all_in_one.xsd" version="1.0" type="standard">... shortened ...</ORDER>
<ORDER xmlns="http://www.opentrans.org/XMLSchema/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opentrans.org/XMLSchema/1.0 openTRANS_ORDER_1_0_all_in_one.xsd" version="1.0" type="standard">... shortened ...</ORDER>
<ORDER xmlns="http://www.opentrans.org/XMLSchema/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opentrans.org/XMLSchema/1.0 openTRANS_ORDER_1_0_all_in_one.xsd" version="1.0" type="standard">... shortened ...</ORDER>
</ORDER_LIST>

额外的命名空间 (xmlns:xsi) 和 xsi:schemaLocation/type 属性应该添加到结果中。

其实我的代码是:
[XmlTypeAttribute(Namespace="http://www.opentrans.org/XMLSchema/1.0")]
public class OrderContainer
{
[XmlElementAttribute("ORDER")]
public List<ORDER> orderList;
}

---- snip ----

string xmlString;

XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.GetEncoding("ISO-8859-1"),
Indent = true,
IndentChars = "\t",
NewLineChars = Environment.NewLine,
ConformanceLevel = ConformanceLevel.Document,
};

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
var testOrder = new ORDER();

var orderContainer = new OrderContainer();
orderContainer.orderList = new List<ORDER>();
orderContainer.orderList.Add(testOrder);

XmlSerializer serializer = new XmlSerializer(typeof(List<ORDER>), new XmlRootAttribute("ORDER_LIST"));

using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
serializer.Serialize(writer, orderList, ns);

xmlString = Encoding.ASCII.GetString(ms.ToArray());
}

Console.WriteLine(xmlString);

它工作得很好 - 除了 ORDER 元素上的命名空间和属性。
背景信息: ORDER 类是从 openTrans 定义 ( opentrans_order_1_0_all_in_one.xsd ) 创建的。
它已使用 Xsd2Code ( Xsd2Code ) 转换为 C# 类。
由于自动生成,用属性装饰类并不容易 - 我猜?

感谢您的任何提示!
(编辑了一些信息)

最佳答案

我知道回答这个问题有点晚了,但我还是会回答,以防有需要的人偶然发现这个问题。

我为了添加命名空间你需要使用这个类:System.Xml.Serialization。 XmlSerializerNamespaces,我在问题代码中看到它已被定义。

以下是我在处理 xCBL Xml Schema 时用于添加命名空间的语法:

[XmlNamespaceDeclarations]
public XmlSerializerNamespaces xmlns; //Defined as the Field of the class you want to serialize

//Defined in the Constructor
xmlns = new XmlSerializerNamespaces();
xmlns.Add("core", "rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd");

这将在生成的 Xml 中添加命名空间,如下所示:
xmlns:core="rrn:org.xcbl:schemas/xcbl/v4_0/core/core.xsd"

关于c# - 将命名空间添加到序列化的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5765266/

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