c# - 有没有办法在 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>
解决方案
推荐阅读
- windows - 使用 PowerShell Direct 重新启动服务器计算机并恢复脚本
- javascript - 我有与按钮相同类的框。单击按钮时,应将文本框添加到相应的框中
- html - 是否可以创建一个始终将用户带到其国家/地区网站的链接?
- vba - 操作 TextRange 时 Mac 与 Windows 的差异与行/段落
- laravel - niklasravnsborg / laravel-pdf 中的波斯数字
- python - 我无法将 bs4 输出导出到文件
- python - 从 c++ 中使用 cppyy 读取 char16_t* 字符串
- python - 类方法局部变量可以修改类变量吗?
- c++ - 从临时对象的成员数据问题中引用初始化
- c - C:将值排序到静态列表中