2011-04-14 68 views
1

我需要根据网络服务规范序列化一些Xml。由于某些原因,我创建了几个不同的类来封装我的应用程序的信息。这些类不直接与xml模式匹配。见下文。使用.Net XmlSerializer,有什么办法可以省略根级标签吗?

<TopLevel> 
    <InfoString>Value</InfoString> 
    <InfoInt>242</InfoInt> 
    <Etcetera>Value2</Etcetera> 
</TopLevel 

虽然我的类是这样的:

public class Info 
    -InfoString 
    -InfoInt 
public class Etcetera 
    -EtceteraValue 

这将产生不正确XML,因为是包含InfoStrings元素信息,以及诸如此类元素包含EtceteraValue。

我实现了IXmlSerializable,但XmlSerializable仍写入我的类的根级别。有任何想法吗?

为了清楚起见:我试图将多个类序列化到相同级别的同一文档中。

+0

看看这篇文章,看看如何设置你的类的属性:http://msdn.microsoft.com/en-us/library/ms733901.aspx – 2011-04-14 14:45:10

回答

1

如果您需要对xml输出进行良好控制,并将完全独立的对象类合并为单个XML,则可以考虑使用XmlWriter,或手动编写XML。

我不知道如何使用纯属性标记来加入这些类来控制序列化。

+0

甚至一个TagBuilder。 – gt124 2011-04-14 15:04:47

+0

TagBuilder是为HTML,而不是XML,你需要MVC框架,如果你的意思是这个TagBuilder – codymanix 2011-04-14 15:17:38

3

我不相信这是可能的,因为这种方式的序列化器可以产生xml,它不能被反序列化明确,如果多个类有一个同名的属性。

您可以自行完成序列化或使用XSLT将输出转换为您需要的xml格式。

我过去的做法是创建传输类,它们具有正确的序列化结构以完全符合我想要的格式。您只需将原始对象中的值填入传输对象。

编辑另一个想法:

可以查询在您使用LINQ,表达你的对象所需的格式的所有数据。之后,您可以使用LINQ to XML将结果序列化为xml。我从来没有这样做过,如果你有运气,请让我知道。

0
public class RootClass 
    { 
     public Info info { get; set; } 
     public Etcetera etc { get; set; } 
    } 

    public class Info 
    { 
     [XmlElement] 
     public string InfoStr { get; set; } 
     [XmlElement] 
     public int InfoInt { get; set; } 
    } 

    public class Etcetera 
    { 
     [XmlElement] 
     public string EtceteraValue { get; set; } 
    } 

然后序列化RootClass

这会给你:

<?xml version="1.0"?> 
<RootClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<info> 
    <InfoStr>asdf</InfoStr> 
    <InfoInt>1</InfoInt> 
</info> 
<etc> 
    <EtceteraValue>etc</EtceteraValue> 
</etc> 

+0

OP说,这种方法确实不起作用,那又如何? – codymanix 2011-04-14 14:54:58

+0

@codymanix我明白了,我的印象是他的输出不是他预期的结果,我的不好! – 2011-04-14 14:59:01

0

要么你:

  1. 拼合类,所以序列化符合您的需求架构。
  2. 创建一个新的扁平类,并使用一些映射框架,以你的结构化类和扁平serailizable类之间进行映射,像Value Injecter
  3. 不要修改类型定义,并尝试使用XSLT
修改XML