Добавить пространства имен в сериализованный XML - PullRequest
0 голосов
/ 23 апреля 2011

У меня довольно неприятная проблема с сериализацией 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 ).
Он был переведен в классы C # с использованием Xsd2Code ( Xsd2Code ).
Из-за автоматической генерации украшение класса с атрибутами не являетсялегко возможно - я думаю?

Спасибо за любую подсказку! (Отредактировал некоторую информацию)

Ответы [ 3 ]

2 голосов
/ 05 февраля 2014

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

Я приказываю добавить пространства имен, вам нужно использовать этот класс: System.Xml.Serialization. XmlSerializerNamespaces, который я вижу в коде проблемы, что он был определен.

Ниже приведен синтаксис, который я использовал для добавления пространств имен при работе со схемой xCBL Xml:

[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"
1 голос
/ 23 апреля 2011

Как это должно выглядеть:

<?xml version="1.0" encoding="iso-8859-1"?>
<ORDER_LIST xmlns:trans="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 http://www.opentrans.org/XMLSchema/1.0 openTRANS_ORDER_1_0_all_in_one.xsd" version="1.0" >
  <trans:ORDER type="standard" >... shortened ...</ORDER>
  <trans:ORDER type="standard" >... shortened ...</ORDER>
  <trans:ORDER type="standard" >... shortened ...</ORDER> 
</ORDER_LIST>

Я не знаком с xsd2code, но если вы программируете вручную, вам нужно поставить атрибуты.

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.opentrans.org/XMLSchema/1.0")]
[System.Xml.Serialization.XmlElementAttribute("Order")]
public class Order() {
            String Type

        }

[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.opentrans.org/XMLSchema/1.0")]
[System.Xml.Serialization.XmlRootAttribute("OrderList", Namespace="http://www.opentrans.org/XMLSchema/1.0", IsNullable=false)]
public class OrderList() {
          List<Orders> 

        }
0 голосов
/ 07 февраля 2013

попробуйте это. это библиотека для создания или чтения документов opentrans! http://opentrans.wordpress.com/

...