首页 > 解决方案 > 有没有办法在 XmlTypeAttribute.TypeName 中强制使用精确的 URL?

问题描述

我需要实现对提供者拒绝和/或无法提供 WSDL 的某些服务的调用...

我在序列化为 XML 时遇到了麻烦。

XmlTypeAttribute.TypeName 中的 URL 被编码。

由于我从提供者那里获得了一些 XML 示例,因此我尝试使用 Edit=>Paste Special=>Paste XML As Classes 生成类,但它只是忽略了“类型”。

我已经手动创建了适当的类,除了 URL 部分之外一切正常。

我已经检查过:C# Escaping XmlType Name with special char within XmlType() Attribute 因为它非常相似,但我的问题不在于缺少命名空间。

这就是我现在所拥有的:

    [XmlRoot(Namespace = @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
    public class Book
    {
        public string Title;
        public string Author;
    }

    [XmlType(TypeName = @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText", Namespace = @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
    public class MyBookType : Book { }

    [XmlInclude(typeof(MyBookType))]
    [XmlRoot("Books", Namespace = @"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
    public class Books : List<Book> { }

    public void Main()
    {
        var b = new Books();
        b.Add(new MyBookType
        {
            Title = "The Art of War",
            Author = "Sun Tzu"
        });
        b.Add(new MyBookType
        {
            Title = "Great Expectations",
            Author = "Charles Dickens"
        });

        var s = new XmlSerializer(typeof(Books));
        s.Serialize(Console.Out, b);
    }

我期待的XML:

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
  <Book xsi:type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
    <Title>The Art of War</Title>
    <Author>Sun Tzu</Author>
  </Book>
  <Book xsi:type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
    <Title>Great Expectations</Title>
    <Author>Charles Dickens</Author>
  </Book>
</Books>

我得到的 XML:

<?xml version="1.0" encoding="utf-8"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
  <Book xsi:type="http_x003A__x002F__x002F_docs.oasis-open.org_x002F_wss_x002F_2004_x002F_01_x002F_oasis-200401-wss-username-token-profile-1.0_x0023_PasswordText">
    <Title>The Art of War</Title>
    <Author>Sun Tzu</Author>
  </Book>
  <Book xsi:type="http_x003A__x002F__x002F_docs.oasis-open.org_x002F_wss_x002F_2004_x002F_01_x002F_oasis-200401-wss-username-token-profile-1.0_x0023_PasswordText">
    <Title>Great Expectations</Title>
    <Author>Charles Dickens</Author>
  </Book>
</Books>

标签: c#xmlsoapxml-attribute

解决方案


推荐阅读