首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在XmlRoot对象中添加c#前缀以序列化XML?

如何在XmlRoot对象中添加c#前缀以序列化XML?
EN

Stack Overflow用户
提问于 2016-03-22 13:25:39
回答 1查看 1.4K关注 0票数 1

我需要为SOAP请求创建一个标头。搜索之后,我成功地用XML生成了头请求,但我需要在XML标记上加上前缀。

实际上,我已经产生了这个:

代码语言:javascript
复制
<TimeStamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TimeStamp-2">
   <Created>2016-03-22T10:10:55.710Z</Created>
   <Expires>2016-03-22T11:10:55.710Z</Expires>
</TimeStamp>

我需要这样做:

代码语言:javascript
复制
<wsu:TimeStamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TimeStamp-2">
   <Created>2016-03-22T10:10:55.710Z</Created>
   <Expires>2016-03-22T11:10:55.710Z</Expires>
</wsu:TimeStamp>

这个主题(How can I pass a username/password in the header to a SOAP WCF Service)启发了我创建类和生成XML。

这是我的版本:

代码语言:javascript
复制
class SecurityHeader : MessageHeader
{

    public override string Name
    {
        get { return "Security"; }
    }

    public override string Namespace
    {
        get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
    }

    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
        XmlSerializer serializer1 = new XmlSerializer(typeof(TimeStamp));
        serializer1.Serialize(Console.Out, new TimeStamp(), ns);

    }
}

[XmlRoot("TimeStamp",Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class TimeStamp
{
    public TimeStamp()
    {
        Id = "TimeStamp-2";
        Created = new Created() { Value = Created.GenerateTimeStampCreation() };
        Expires = new Expires() { Value = Expires.GenerateTimeStampExpiration() };
    }

    [XmlAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
    public string Id { get; set; }

    [XmlElement]
    public Created Created { get; set; }

    [XmlElement]
    public Expires Expires { get; set; }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-22 18:41:21

你在这里有几个问题:

  1. 您的<Created><Expires>元素不在"wsu"命名空间中,而是不在任何名称空间中。您需要通过设置XmlSerializer[XmlElement(Namespace="")]通知[XmlElement(Form = XmlSchemaForm.Unqualified)][XmlElement(Namespace="")]
  2. 要强制Id属性具有显式命名空间,需要设置[XmlAttribute(Form = XmlSchemaForm.Qualified)]
  3. 您的命名空间中有一个错误。您想要的XML有名称空间xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd",但有时需要"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"。为了避免这种错误,您可以创建一个包含正确命名空间的public const string,而不是多次重新键入字符串。

因此,固定的TimeStamp类如下所示:

代码语言:javascript
复制
[XmlRoot("TimeStamp", Namespace = TimeStamp.WsuNamespace)]
public class TimeStamp
{
    public const string WsuNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";

    public TimeStamp()
    {
        Id = "TimeStamp-2";
        Created = new Created() { Value = Created.GenerateTimeStampCreation() };
        Expires = new Expires() { Value = Expires.GenerateTimeStampExpiration() };
    }

    [XmlAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified)] // Indicates this attribute is explicitly in the same namespace as the parent class
    public string Id { get; set; }

    [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] // Indicates this element is not in any namespace
    public Created Created { get; set; }

    [XmlElement(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] // Indicates this element is not in any namespace
    public Expires Expires { get; set; }
}

在您的写作方法中,请执行:

代码语言:javascript
复制
    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
    {
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("wsu", TimeStamp.WsuNamespace);
        XmlSerializer serializer1 = new XmlSerializer(typeof(TimeStamp));
        serializer1.Serialize(writer, new TimeStamp(), ns);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36155620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档