C# XML API请求返回;d3p1“;对于数组或子类

C# XML API请求返回;d3p1“;对于数组或子类,c#,.net,xml,xml-serialization,C#,.net,Xml,Xml Serialization,使用Postman、C#、.NET Framework 4.7 我从Postman发出一个GET请求,内容接受设置为“application/xml”,我的.NETFrameworkWebAPI将用xml响应(非常棒!)。当我返回Request.CreateResponse(HttpStatusCode.OK,myResponse)时,我不需要手动序列化任何内容,因为.NET Framework会序列化我的响应对象 但是,它似乎包含我不熟悉的额外内容,我想知道是否可以通过Global.asax设

使用Postman、C#、.NET Framework 4.7

我从Postman发出一个GET请求,内容接受设置为“application/xml”,我的.NETFrameworkWebAPI将用xml响应(非常棒!)。当我返回
Request.CreateResponse(HttpStatusCode.OK,myResponse)
时,我不需要手动序列化任何内容,因为.NET Framework会序列化我的响应对象

但是,它似乎包含我不熟悉的额外内容,我想知道是否可以通过Global.asax设置或类似设置删除它们

  • xmlns=”http://schemas.datacontract.org/2004/07/dto.MyModels“是我想删除的东西
  • “d3p1”不是我在创建XML时遇到的东西。我能把它移走吗
  • 当某个内容为空时弹出。当它为空时,是否可能只是出现或不出现
因此,XML响应如下所示:

<SimpleResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels">
    <error i:nil="true" />
    <result>
        <bookList xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.MyModels.Shared">
            <d3p1:Book>
                <d3p1:bookname>Book 1 Name</d3p1:bookname>
                <d3p1:serial>ZMeTaQ1kejh0mJYGHE4+1a4Y2juU6tMDd5zYDqN4tqI=</d3p1:serial>
                <d3p1:id>4</d3p1:id>

            </d3p1:Book>
            <d3p1:Book>
                <d3p1:bookname>Hello World</d3p1:bookname>
                <d3p1:serial>9lM16kho3bgsrG+wRh4ejtZjwrYJwp6FbRqnnZ4CJPA=</d3p1:serial>
                <d3p1:id>5</d3p1:id>
            </d3p1:Book>
            <d3p1:Book>
                <d3p1:bookname>Ding</d3p1:bookname>
                <d3p1:serial>XCqqKB+Wi3i4z6nN1Ry8IHtar6ogojjiqxMfvfgC0qc=</d3p1:serial>
                <d3p1:id>6</d3p1:id>
            </d3p1:Book>
        </bookList>
        <author xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.Models.Android.Shared">
            <d3p1:pictureId>0</d3p1:pictureId>
            <d3p1:websiteurl i:nil="true" />
            <d3p1:email i:nil="true" />
            <d3p1:name>Jo Blogs</d3p1:size>
            <d3p1:age>0</d3p1:size>
        </author>
    </result>
</SimpleResponse>
public string error { get; set;}
public class SimpleResponse 
{
 public List<Book> bookList { get; set; }
 public Author author { get; set; }
}

public class Book
{
    public string bookname { get; set; }
    public string serial { get; set; }
    public int id { get; set; }
}

public class Author
{
    public string pictureId{ get; set; }
    public string websiteurl { get; set; }
    public string email { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}

第一册书名
ZMeTaQ1kejh0mJYGHE4+1A4Y2JU6TMDD5ZYDQN4TQI=
4.
你好,世界
9LM16KO3BGSRG+WRH4EJTZJWRYWP6FBRQNNZ4CJPA=
5.
叮
XCQKB+Wi3i4z6nN1Ry8IHtar6ogojjiqxMfvfgC0qc=
6.
0
Jo博客
0
我的课程是这样的:

<SimpleResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/dto.MyModels">
    <error i:nil="true" />
    <result>
        <bookList xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.MyModels.Shared">
            <d3p1:Book>
                <d3p1:bookname>Book 1 Name</d3p1:bookname>
                <d3p1:serial>ZMeTaQ1kejh0mJYGHE4+1a4Y2juU6tMDd5zYDqN4tqI=</d3p1:serial>
                <d3p1:id>4</d3p1:id>

            </d3p1:Book>
            <d3p1:Book>
                <d3p1:bookname>Hello World</d3p1:bookname>
                <d3p1:serial>9lM16kho3bgsrG+wRh4ejtZjwrYJwp6FbRqnnZ4CJPA=</d3p1:serial>
                <d3p1:id>5</d3p1:id>
            </d3p1:Book>
            <d3p1:Book>
                <d3p1:bookname>Ding</d3p1:bookname>
                <d3p1:serial>XCqqKB+Wi3i4z6nN1Ry8IHtar6ogojjiqxMfvfgC0qc=</d3p1:serial>
                <d3p1:id>6</d3p1:id>
            </d3p1:Book>
        </bookList>
        <author xmlns:d3p1="http://schemas.datacontract.org/2004/07/dto.Models.Android.Shared">
            <d3p1:pictureId>0</d3p1:pictureId>
            <d3p1:websiteurl i:nil="true" />
            <d3p1:email i:nil="true" />
            <d3p1:name>Jo Blogs</d3p1:size>
            <d3p1:age>0</d3p1:size>
        </author>
    </result>
</SimpleResponse>
public string error { get; set;}
public class SimpleResponse 
{
 public List<Book> bookList { get; set; }
 public Author author { get; set; }
}

public class Book
{
    public string bookname { get; set; }
    public string serial { get; set; }
    public int id { get; set; }
}

public class Author
{
    public string pictureId{ get; set; }
    public string websiteurl { get; set; }
    public string email { get; set; }
    public string name { get; set; }
    public int age { get; set; }
}
公共字符串错误{get;set;}
公共类简单响应
{
公共列表图书列表{get;set;}
公共作者{get;set;}
}
公共课堂用书
{
公共字符串bookname{get;set;}
公共字符串序列{get;set;}
公共int id{get;set;}
}
公共类作者
{
公共字符串pictureId{get;set;}
公共字符串网站URL{get;set;}
公共字符串电子邮件{get;set;}
公共字符串名称{get;set;}
公共整数{get;set;}
}
xmlns=”http://schemas.datacontract.org/2004/07/dto.MyModels“是我想删除的东西
“d3p1”不是我在创建XML时遇到的东西。我可以用什么方法删除它吗?

属性:

  • xmlns=”http://schemas.datacontract.org/2004/07/dto.MyModels“
  • xmlns:d3p1=”http://schemas.datacontract.org/2004/07/dto.MyModels.Shared“
都是。第一个为XML文档建立默认的XML名称空间;第二个声明了一个名称空间,所有以
d3p1:
开头的子元素都属于该名称空间

从所选择的特定名称空间可以看出,您正在使用它进行XML序列化。此序列化程序根据中记录的规则分配XML名称空间

默认情况下,任何给定的CLR命名空间(格式为CLR.namespace)都映射到该命名空间http://schemas.datacontract.org/2004/07/Clr.Namespace. 若要替代此默认值,请将该属性应用于整个模块或程序集。或者,要控制每个类型的数据协定命名空间,请设置的属性

由于您不希望为任何类型使用XML命名空间,因此第一个选项似乎是最简单的:将以下属性应用于程序集:

[程序集:ContractNamespaceAttribute(“,ClrNamespace=“dto.MyModels”)]
[程序集:ContractNamespaceAttribute(“,ClrNamespace=“dto.MyModels.Shared”)]
[assembly:ContractNamespaceAttribute(“,ClrNamespace=“dto.Models.Android.Shared”)]
或者,您可以应用于您的类型:

[DataContract(Name = "Book", Namespace = "")]
public class Book
{
    [DataMember]
    public string bookname { get; set; }
    [DataMember]
    public string serial { get; set; }
    [DataMember]
    public int id { get; set; }
}
请注意,数据协定序列化是,因此您需要将
[DataMember]
应用于要序列化的每个成员

作为最后一种选择,您可以切换到使用没有默认XML名称空间的。为此,您需要申请服务合同,如中所示

当某个值为空时弹出。当它为空时是否可能只是出现或不出现?

可以通过设置引用类型数据成员来删除这些空元素,如到中所示:


或者,您可以切换到默认情况下不输出空引用值的
XmlSerializer

需要架构来验证xml。验证正在查找缺失的值,该值给出了nil=true。感谢您的精彩回复。我还没有把它标记为答案,因为我需要一点时间来处理和测试。非常感谢您的时间和努力!为了实现我想要的(无名称空间、无d3p1和无nill值),我添加了ContractNamespaceAttribute以清除CLR名称空间,并在global.asx中启用了use-xmlSerializer=true。这很奇怪,是不是很糟糕???@PKCS12-这并没有什么害处,但一旦您切换到使用
XmlSerializer
,设置
ContractNamespaceAttribute
就变得不必要了。omg,非常感谢您指出这一点。我刚刚做了一个360度的测试。我一直都有自己想要的解决方案,但却把它与数据契约序列化混为一谈:((