2012-03-09 73 views
0

我需要将一个对象序列化为.Net中的以下XML。如何在.Net中创建此XML?

也许最简单的方法是实现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:type我无法进入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> 
+0

我能想到的一切 - 这包括实现IXMLSerializable和使用XMLDocument里面。我不知道如何制作上述内容。我可以粘贴示例,但他们只会混淆这个问题,因为我有大约50行代码不会产生所需的代码... – 2012-03-09 13:27:24

+0

实施IXMLSerializable时发生了什么,并且它不令人满意? – 2012-03-09 13:36:27

+0

您是否尝试将* .xsd文件喂入到xsd.exe中,生成一个类并将其用于序列化? – AVIDeveloper 2012-03-09 14:12:24

回答

2

您可以使用.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") 
       ) 
      ) 
     ) 
    ) 
); 

你可以看一下this MSDN page来看看如何使用LINQ到XML,以及this link说明如何创建XML发辫将XML名称空间应用于它们。

编辑:

从下面您的意见继,似乎要在一个不太标准的方法,你不能有我上面定义的根元素,但LINQ到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到XML已经插在ProcessRepairOrder,因为使用xmlns:ns2命名空间ns2整个层次结构中的元素需要在某处定义。但是现在你已经有了这种字符串格式,你可以很容易地使用String.Replace()来删除它,并且你最终会得到你需要的。

我不会说这是一个优雅的解决方案,但它可以用于生成XML的非标准方法。

+0

看起来很有希望,我会创建一个测试看看。 – 2012-03-19 09:46:28

+0

您已经添加了根元素,这是不允许的 - 根元素需要是' 2012-03-20 10:33:42

+0

我可以在其中一个链接上看到一些类似的示例 - http://msdn.microsoft.com/zh-cn/library/bb387075。 aspx,但我需要创建而不是 2012-03-20 10:52:16