Как я могу создать этот XML в .Net? - PullRequest
0 голосов
/ 09 марта 2012

Мне нужно сериализовать объект в следующий XML в .Net.

Вероятно, самый простой способ - реализовать IXMLSerializable из-за того, что мне нужен контроль над конечным результатом .... Что мне нужно сделать, чтобы вывести следующую схему:

<ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0">
    <ns2:ApplicationArea>
       <ns2:Sender>
          <ns2:CreatorNameCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:TextType">SomeVendor</ns2:CreatorNameCode>
          <ns2:SenderNameCode name="Dave"/>
       <ns2:Sender>
    </ns2:ApplicationArea>
</ns2:ProcessRepairOrder>

Точнее, это префиксы без пространства имен и тип xsi:, который я не могу получить в XML.

полная версия выглядит так:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns1:PutMessage xmlns:ns1="http://www.starstandards.org/webservices/2009/transport" xmlns:ns2="http://www.starstandard.org/STAR/5" xmlns:ns3="http://www.openapplications.org/oagis/9">
      <ns1:payload>
        <ns1:content>
          <ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0">
          ...many more XML elements
      </ns2:ProcessRepairOrder>
    </ns1:PutMessage>
  </S:Body>
</S:Envelope>

1 Ответ

2 голосов
/ 09 марта 2012

Вы можете использовать .NET 3.5? Если это так, LINQ-to-XML может быть проще в использовании. Вот некоторый код, который я протестировал и который в точности выведет XML в вашем вопросе:

XNamespace ns2 = "some-uri";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

XElement root = new XElement("Root",
    // Define ns2 namespace on Root element
    new XAttribute(XNamespace.Xmlns + "ns2", ns2.NamespaceName),
    new XElement(ns2 + "ProcessRepairOrder",
        // Attributes of ProcessRepairOrder
        new XAttribute("languageCode", "de-DE"),
        new XAttribute("releaseID", "1.0"),
        new XAttribute("systemEnvironmentCode", "PROD"),
        new XAttribute("versionID", "1.0"),
        // Child elements of ProcessRepairOrder
        new XElement(ns2 + "ApplicationArea",
            new XElement(ns2 + "Sender",
                new XElement(ns2 + "CreatorNameCode",
                    // Attributes of CreatorNameCode and define xsi namespace
                    new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
                    new XAttribute(xsi + "type", "ns3:TextType"),
                    // Value of CreatorNameCode,
                    "SomeVendor"
                ),
                new XElement(ns2 + "SenderNameCode",
                    // Attributes of SenderNameCode
                    new XAttribute("name", "Dave")
                )
            )
        )
    )
);

Вы можете посмотреть эту страницу MSDN , чтобы узнать, как создать XML-файл, используя LINQ-to-XML, а эта ссылка объясняет, как применять к ним пространства имен XML. *

Отредактировано:

Исходя из ваших комментариев ниже, кажется, что вам нужен менее стандартный подход, поскольку у вас не может быть корневого элемента, который я определил выше, но LINQ-to-XML, кажется, требует его для создания действительного Структура XML с определенными правильными пространствами имен. Если вы хотите использовать этот подход, то есть способ обойти это, но он требует немного больше возиться с выводом.

Использование кода, который я написал выше, а затем выполнение root.Elements().First().ToString() приведет к получению этого сериализованного XML:

<ns2:ProcessRepairOrder languageCode="de-DE" releaseID="1.0" systemEnvironmentCode="PROD" versionID="1.0" xmlns:ns2="some-uri">
  <ns2:ApplicationArea>
    <ns2:Sender>
      <ns2:CreatorNameCode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns3:TextType">SomeVendor</ns2:CreatorNameCode>
      <ns2:SenderNameCode name="Dave" />
    </ns2:Sender>
  </ns2:ApplicationArea>
</ns2:ProcessRepairOrder>

Почти там, но обратите внимание, что LINQ-to-XML вставил пространство имен xmlns:ns2 в ProcessRepairOrder, потому что для использования элементов ns2 во всей иерархии его необходимо где-то определить. Но теперь, когда у вас есть это в строковом формате, вы можете легко использовать String.Replace(), чтобы удалить это, и вы получите то, что вам нужно.

Я бы не сказал, что это элегантное решение, но оно подойдет для вашего нестандартного метода создания XML.

...