2009-06-18 30 views
2

当前实现什么是适合Web服务的XML类型?

SQL Server 2005数据库有一个表叫了一个名为XML类型的MessageXml列的消息。

C#使用Linq to Sql类的库项目,该类使用名为MessageXml的类型为XElement的字段生成名为Message的类。

WCF Webservice,公开一个MessagePayload类,其中包含一个名为MessageXml的XElement类型的属性。

Web服务不提供由Linq创建的消息类到Sql。我使用重量轻的物体作为之间的一部分。

问题

是真正的XElement我希望可以用我的WCF服务或是否有更好的类型的类型。打算传入服务的xml应该是完整的文档。另外,我在将Xml文档作为XElement加载时遇到了一些问题。我认为我应该在服务的轻量级类中公开一个完整的xml文档类型,但是我对XDocument和XmlDocument之间的区别感到困惑。

最重要的是,我不能公开带有XDocument类型属性的WCF Message类,因为它包含无法序列化的XDeclaration类型的属性。

如果我使用XmlDocument,而不是我必须在Linq类和轻量级类之间进行翻译时做这种奇怪的xml类型转换。

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(message.MessageXml.ToString()); 

MessageEnvelope retVal = new MessageEnvelope() 
{ 
     MessageXml = doc, 
}; 

的XmlDocument似乎是正确的,我知道我必须做一些翻译,但希望得到尽可能接近适合作为可能的。

回答

3

您可以使用的XElement或XmlElement的:

public XmlElement GetXmlElement() 
{ 
    var doc = new XmlDocument(); 
    doc.Load(PREFIX + @"Enumerations.wsdl"); 

    return doc.DocumentElement; 
} 

public XElement GetXElement() 
{ 
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl"); 
    return doc.Root; 
} 

你不想或者XDocument也不XmlDocument。请记住,无论您返回的内容是包含SOAP信封的XML文档的中间。你不能在文档中有文档,所以你想要的是一个元素。

-1

使用您需要的任何类型来序列化类(字符串一直适用于我),然后在服务器或客户端进行必要的转换以维护文档的完整性。您还可以从一个或多个XElement中构建一个XDocument,因此我将使用XElement。

最糟糕的情况是,你甚至可以重载你的类的序列化行为(如果你对反射有好处,那么不会太糟糕)。

XmlDocument是旧的非Linq文档。它们是在不同类别中实施的相同概念。

+1

-1:XML与字符串不同。不要用它来表示XML。 – 2009-07-27 03:25:18

+0

我知道,这就是为什么你必须验证它在序列化转换前后... – marr75 2009-07-28 16:06:13

-2

就性能而言,通常,XDocumentXElememnt优选为XmlDocumentXmlElement

不过,我会建议使用string通过WCF服务发送一个XML文件,原因如下:

  1. 互操作性
    • 客户端不依赖于特定的.NET framework版本(客户可以选择使用XDocumentXmlDocument。只要WCF服务以这种方式配置,即使基于Java的客户端也可以被支持)。
  2. 如果原始XML文档包含它,则正确处理Xml声明。

注意:请确保适当地调整配置以支持大的xml文档。例如,basicHttpBinding的默认最大消息大小为64KB。

3

约翰桑德斯在这里的钱。稍微详细说明,如果你看一下所生成的WSDL当您返回任何一个XmlElementXElement,你会看到这样的事情:

<xs:complexType> 
    <xs:sequence> 
    <xs:any minOccurs="0" processContents="lax"/> 
    </xs:sequence> 
</xs:complexType> 

就是这样。它基本上意味着任何XML都可以在这里。这也意味着,与Chansik的建议相反,它不会将返回类型绑定到.NET特定类型。

所以是的,你不需要使用字符串。