更改 XML 标记前缀 SOAP

Posted

技术标签:

【中文标题】更改 XML 标记前缀 SOAP【英文标题】:Change XML Tag Prefix SOAP 【发布时间】:2019-04-17 08:49:51 【问题描述】:

我正在尝试创建带有前缀的 SOAP 消息。但是,我无法正确设置命名空间。我已经尝试了几天并尝试了许多我在网上找到的建议,但似乎没有一个有效。我希望你们中的一些人可以帮助我。 我得到的是

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Transaction xmlns="http://tempuri.org/">
      <bankingTransaction>
        <operation parameterOrder="string">
          <fault />
          <fault />
        </operation>
        <transactionDate>dateTime</transactionDate>
        <amount>int</amount>
      </bankingTransaction>
    </Transaction>
  </soap:Body>
</soap:Envelope>

&我真正需要的是

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <res:Transaction xmlns="res:http://tempuri.org/">
      <res:bankingTransaction>
        <res:operation parameterOrder="string">
          <res:fault />
          <res:fault />
        </res:operation>
        <res:transactionDate>dateTime</res:transactionDate>
        <res:amount>int</res:amount>
      </res:bankingTransaction>
    </res:Transaction>
  </soap:Body>
</soap:Envelope>

&我的MassageContact

[MessageContract]
public class BankingTransaction

   [MessageHeader] public Operation operation;
   [MessageHeader] public DateTime transactionDate;
   [MessageBodyMember] private unit sourceAccount;
   [MessageBodyMember] public int amount;

请帮我为我的 XML 元素添加前缀。 谢谢

【问题讨论】:

【参考方案1】:

你可能需要做这样的事情:

[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/")]
[MessageContract]
public class BankingTransaction

   [MessageHeader] public Operation operation;
   [MessageHeader] public DateTime transactionDate;
   [MessageBodyMember] private unit sourceAccount;
   [MessageBodyMember] public int amount;

我不确定你是如何序列化你的对象的,但是像这样会添加前缀:

   XmlSerializerNamespaces x = new XmlSerializerNamespaces();
    x.Add("res", "http://tempuri.org/");

可能将XmlSerializerNamespaces 添加到您的序列化过程中?很难说没有看到你在做什么。该命名空间中的所有合约/类可能都需要此属性:[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://tempuri.org/")]

【讨论】:

我不知道我需要在哪里使用这个 XmlSerializerNamespaces x = new XmlSerializerNamespaces(); x.Add("res", "tempuri.org/");【参考方案2】:

我们可以创建一个MessageFormatter来自定义消息格式,你可以参考以下官方教程。https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/custom-message-formatters 这是一个有关如何执行此操作的示例。https://***.com/questions/31595770/c-sharp-wcf-global-namespaces-royal-mail/31597758#31597758 http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix

【讨论】:

以上是关于更改 XML 标记前缀 SOAP的主要内容,如果未能解决你的问题,请参考以下文章

PHP/SOAP/XML 文档中根元素之前的标记必须格式正确

如何从 PHP 中的以下 SOAP XML 响应中获取 pinBlocked 标记

在 C# 中,如何使用大量精美的标记将 POCO 序列化为 XML?

go - 标记/隐藏父标记中的属性:SOAP信封

如何找出此 XML 中 <Result> 标记的 XPath?

如何在 c# 中替换 xml 开始标记和 xml 结束标记之间的内容?