控制WCF XML输出中的命名空间前缀
我的WCF服务的当前输出如下(只有一部分显示如下):
STATE_CD 1 STATE_CD_TXT Alabama STATE_CD_SHORT_TXT AL
在该示例中,对于每个US状态重复“RowDetail”元素。
我有两个问题:
-
如何删除标签中的“a:”前缀。 我假设我需要更改xmlns设置,但我不知道如何在不抛出错误的情况下执行此操作。 我查看了其他线程,但无法使其工作。
-
是否可以从输出中删除无关元素,即“行”和“字段”? 我理解为什么他们在那里 – 这是由于我如何设置我的课程(下面发布),但看看IMO是很麻烦的。
类别:
[DataContract] public class Results2Detail { [DataMember] public RowDetail[] Rows; } [DataContract] public class RowDetail { [DataMember] public FieldDetail[] Fields; } [DataContract] public class FieldDetail { [DataMember] public String name; [DataMember] public String value; }
这里的问题如下:
-
你有一些外部类对应于
executeSelectSP2Response
(在你的问题中没有显示),它被序列化时被放置在默认命名空间"http://tempuri.org/"
中。 您可能不希望这样,因为它是ASP.Net Web服务的测试默认命名空间 ,您应该用公司特定的命名空间替换它。有关更换它的说明,请参阅此处或此处 。
-
显示的类的
DataContract
属性没有NameSpace
属性,因此默认情况下,所有类都要序列化到命名空间"http://schemas.datacontract.org/2004/07/Clr.Namespace"
。 这与其父元素的默认命名空间不同,因此必须指定override命名空间。a:
前缀引用xmlns:a="http://schemas.datacontract.org/2004/07/WCF_Services.DataContract"
属性,并指定标记的每个元素都属于该命名空间。如果要指定
Results2Detail
等。 人。 不属于特定的命名空间(即从父级inheritance其命名空间),您可以这样做:[DataContract(Namespace="")] public class Results2Detail { [DataMember] public RowDetail[] Rows; } [DataContract(Namespace = "")] public class RowDetail { [DataMember] public FieldDetail[] Fields; } [DataContract(Namespace = "")] public class FieldDetail { [DataMember] public String name; [DataMember] public String value; }
如果你想要一个特定的命名空间,你可以做
[DataContract(Namespace = Namespaces.CompanyNameSpace)]
,其中Namespaces
是一些静态类,如:public static class Namespaces { const string CompanyNameSpace = "http://company.namespace.org"; // or whatever. }
-
你的问题#2不清楚。 你是说你希望你的数组显示为单个级别的元素而不是两个嵌套的元素级别,即:
如果是这样,那么不,
DataContractSerializer
不能立即实现这种控制水平。 您必须实现IXmlSerializable
并手动执行,或者切换到XmlSerializer
并使用XmlElement
属性修饰数组。