c# - 带有 DTD 解析错误的 .NET Core Web API XML

标签 c# xml dtd doctype asp.net-core-webapi

我正在集成接受 XML 请求、解析 XML,然后将其发送到 WorldPay XML API 的中间件 API 服务。该应用程序是在 .NET Core 中开发的。

我已经创建了与 XML 匹配的类,并且正在使用该类作为 Controller 端点中的输入参数。

基于 WorldPay XML API docs ,有效请求的格式为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//Worldpay//DTD Worldpay PaymentService v1//EN"
  "http://dtd.worldpay.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="YOUR_MERCHANT_CODE"> <!--Enter your own merchant code-->
  <submit>
    <order orderCode="YOUR_ORDER_CODE"> <!--Enter a unique order code each time-->
      <description>YOUR DESCRIPTION</description> <!--Enter a description useful to you-->
      <amount currencyCode="GBP" exponent="2" value="5000"/>
      <paymentDetails>
        <CARD-SSL>
          <cardNumber>4444333322221111</cardNumber>
          <expiryDate><date month="01" year="2020"/></expiryDate> 
          <cardHolderName>A Shopper</cardHolderName>
          <cardAddress>
            <address>
              <address1>47A</address1>
              <postalCode>CB94BQ</postalCode>
              <city>Cambridge</city>
              <countryCode>GB</countryCode>
            </address>
          </cardAddress>
        </CARD-SSL>
        <session shopperIPAddress="123.123.123.123" id="0215ui8ib1" /> 
      </paymentDetails>
      <shopper>
        <shopperEmailAddress>ashopper@myprovider.com</shopperEmailAddress>
      </shopper>
    </order>
  </submit>
</paymentService>

API 端点应与 WorldPay API 端点 1:1。该服务应将商家代码修改为服务正在使用的商家代码,混淆敏感数据,记录/跟踪它并向 WorldPay 发送请求。

我遇到的问题是,如果请求 XML 中包含 !DOCTYPE,我创建的类作为端点中的参数为 null。如果我删除 !DOCTYPE 和其中的信息,XML 将被很好地解析并且作为参数的对象是有效的。

我的 swagger 端点如下所示:

<?xml version="1.0"?>
<paymentService>
  <submit>
    <order>
      <description>string</description>
      <amount>
        <currencyCode>string</currencyCode>
        <exponent>string</exponent>
        <value>string</value>
      </amount>
      <paymentDetails>
        <cardssl>
          <cardNumber>string</cardNumber>
          <expiryDate>
            <date>
              <month>string</month>
              <year>string</year>
            </date>
          </expiryDate>
          <cardHolderName>string</cardHolderName>
          <cardAddress>
            <address>
              <address1>string</address1>
              <postalCode>string</postalCode>
              <city>string</city>
              <countryCode>string</countryCode>
            </address>
          </cardAddress>
        </cardssl>
        <session>
          <shopperIPAddress>string</shopperIPAddress>
          <id>string</id>
        </session>
      </paymentDetails>
      <shopper>
        <shopperEmailAddress>string</shopperEmailAddress>
      </shopper>
      <orderCode>string</orderCode>
    </order>
  </submit>
  <version>string</version>
  <merchantCode>string</merchantCode>
</paymentService>

最佳答案

它可能不解析 XML,因为它对 DTD 无效。

您正在创建的 XML 无效,因为您没有标记接口(interface)来告诉它什么是元素以及什么是属性,例如 orderCode 被呈现为元素而不是属性。

我猜你需要你的界面看起来像这样

[XmlAttribute]
public string orderCode { get; set; }

[XmlAttribute("orderCode")]
public string OrderCode { get; set; }

在将 DTD 放回原处之前确保您的 XML 有效,请查看 https://liquid-technologies.com/online-xml-validator

关于c# - 带有 DTD 解析错误的 .NET Core Web API XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724363/

相关文章:

c# - LINQ:从 linq 中调用方法?,我的方法返回匿名类型

Java+ jackson +XML : serialize a java object properties as XML elements with same names

.net - vs 2008 javascript intellisense in XML 文件问题

java - Java 中的 DTD 解析

c# - Word-Wrap 上的 Fire 事件

c# - 使用命令行构建 C#/.NET 时如何设置配置?

java - 错误 : Invalid content was found starting with element 'X' . 应为 '{X}' 之一

java - Java 中是否有与 Ruby 的 Nokogiri::XML::EntityDecl 等效的东西?

java - 在 Java 中解析 XML 文件时如何忽略内联 DTD

c# - ICSharpCode.SharpZipLib 验证 zip 文件