如何在没有命名空间的情况下将 XML 字符串附加到 DOMDocument

亚历山大·泰巴尔迪

我正在使用 PHP,并且必须构建一个SOAP1.1Document/Literal)请求,其中包含soap:Body标记内的 XML 消息

我的第一个问题是我以前从未使用过这个“协议”。

我的 XML 消息非常复杂,所以我使用SimpleXMLElement类来单独构建它。为了撰写SOAP消息,我有两个 XML 字符串:

1-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://www.w3.org/2003/05/soap-envelope">
  <soap:Header></soap:Header>
  <soap:Body>...</soap:Body>
</soap:Envelope>

2- 我的自定义 XML 字符串

<eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02" grupo="1">
  <envioLoteEventos>
    <ideEmpregador tpInsc="1" nrInsc="0000000012"/>
    <ideTransmissor tpInsc="1" nrInsc="0000000012"/>
    <eventos>
      <eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02">
        <evtInfoEmpregador Id="8515">...</evtInfoEmpregador>
      </eSocial>
    </eventos> 
  </envioLoteEventos>
</eSocial>
  • 我需要的是:soap:Body标签内的第二个字符串完全一样。
  • 我得到的是:里面的第二个字符串soap:Body带有一堆由DOMDocument.

我正在使用的算法(不是完整代码):

$soapBodyElement = new SimpleXMLElement($soapBodyString);
$customMessageElement = new SimpleXMLElement($customMessageString);
// Some operations...
$domParent = dom_import_simplexml($soapBodyElement);
$domChild = dom_import_simplexml($customMessageElement);
$domDocument = $domParent->ownerDocument->importNode($domChild, true);
$domParent->appendChild($domDocument);

echo $domParent->ownerDocument->saveXML();

输出:

<soap:Envelope 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header/>
  <soap:Body>
    <eSocial xmlns="http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02" xmlns:default="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02" xmlns:default1="http://www.w3.org/2000/09/xmldsig#" grupo="1">
      <envioLoteEventos>
        <ideEmpregador tpInsc="1" nrInsc="0000000012"/>
        <ideTransmissor tpInsc="1" nrInsc="0000000012"/>
        <eventos>
          <default:eSocial xmlns="http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02">
            <default:evtInfoEmpregador Id="2550">...</default:evtInfoEmpregador>
          </default:eSocial>
        </eventos>
      </envioLoteEventos>
    </eSocial>     
  </soap:Body>
</soap:Envelope>

老实说,我不知道为什么要添加这个default前缀(命名空间?)。

如何在没有这种自动行为的情况下附加两个 XML 字符串?

金森

您可以使用Marshal XML Serializer,它比 DOMDocument 和 SimpleXML 更容易使用。

那么你可以执行以下操作:

SoapEnvelopeMapper.php

use KingsonDe\Marshal\AbstractXmlMapper;

class SoapEnvelopeMapper extends AbstractXmlMapper {

    /**
     * @var AbstractXmlMapper
     */
    private $messageMapper;

    public function __construct(AbstractXmlMapper $messageMapper) {
        $this->messageMapper = $messageMapper;
    }

    public function map($data) {
        return [
            'soap:Envelope' => [
                $this->attributes() => [
                    'xmlns:xsi'  => 'http://www.w3.org/2001/XMLSchema-instance',
                    'xmlns:xsd'  => 'http://www.w3.org/2001/XMLSchema',
                    'xmlns:soap' => 'http://www.w3.org/2003/05/soap-envelope',
                ],
                'soap:Header' => null,
                'soap:Body' => $this->item($this->messageMapper, $data),
            ]
        ];
    }
}

SoapMessageMapper.php

use KingsonDe\Marshal\AbstractXmlMapper;

class SoapMessageMapper extends AbstractXmlMapper {

    public function map($data) {
        return [
            'eSocial' => [
                $this->attributes() => [
                    'xmlns'          => 'http://www.esocial.gov.br/schema/lote/eventos/envio/v2_2_02',
                    'xmlns:default'  => 'http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02',
                    'xmlns:default1' => 'http://www.w3.org/2000/09/xmldsig#',
                    'grupo'          => 1,
                ],
                'envioLoteEventos' => [
                    'ideEmpregador' => [
                        $this->attributes() => [
                            'tpInsc' => 1,
                            'nrInsc' => '0000000012',
                        ],
                    ],
                    'ideTransmissor' => [
                        $this->attributes() => [
                            'tpInsc' => 1,
                            'nrInsc' => '0000000012',
                        ],
                    ],
                ],
                'eventos' => [
                    'eSocial' => [
                        $this->attributes() => [
                            'xmlns' => 'http://www.esocial.gov.br/schema/evt/evtInfoEmpregador/v2_2_02',
                        ],
                        'evtInfoEmpregador' => [
                            $this->attributes() => [
                                'Id' => 2550,
                            ],
                            $this->data() => '...',
                        ],
                    ],
                ],
            ]
        ];
    }
}

SoapResponse.php

$data = new \stdClass();

$messageMapper  = new SoapMessageMapper();
$envelopeMapper = new SoapEnvelopeMapper($messageMapper);

$xml = MarshalXml::serializeItem($envelopeMapper, $data);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中将字符附加到字符串?

来自分类Dev

解析XML时如何防止将\ n附加到NSmutable字符串?

来自分类Dev

Python将*。*附加到字符串

来自分类Dev

在将字符串添加到XML之前对字符串进行消毒?

来自分类Dev

如何使用DOMDocument更改xml源

来自分类Dev

java将cdata添加到xml字符串

来自分类Dev

如何在bash中将日期附加到字符串

来自分类Dev

PHP DOMDocument:如何合并xml字符串?

来自分类Dev

如何在不使用字符串比较的情况下使用node.js快速将节点附加到XML文件中

来自分类Dev

如何在elasticsearch中将字符附加到字符串?

来自分类Dev

如何附加到字符串?

来自分类Dev

将Xml字符串添加到Xml节点

来自分类Dev

如何将分号(;)附加到cmake字符串

来自分类Dev

DOMDocument没有定义吗?将数据保存到XML

来自分类Dev

如何在Xcode中将变量附加到字符串

来自分类Dev

将xml DOMDocument转换为HTML字符串并回显

来自分类Dev

如何将属性附加到字符串?

来自分类Dev

将片段附加到字符串

来自分类Dev

在将字符串添加到XML之前对字符串进行消毒?

来自分类Dev

如何在没有直接ID引用的情况下从Strings.xml获取字符串数组的ID

来自分类Dev

如何将字符串内容附加到数组

来自分类Dev

将变量附加到字符串

来自分类Dev

如何使用exiftool将字符串附加到标签

来自分类Dev

如何在不转义CDATA节点值的情况下将Node对象转换为XML字符串?

来自分类Dev

如何使用javascript将字符串附加到textarea

来自分类Dev

使用 DOMDocument 将新节点及其子节点添加到 XML 文档

来自分类Dev

如何在没有 .xml 和资源的情况下将字符串添加到微调器

来自分类Dev

无法在python中使用lxml将gml字符串附加到xml

来自分类Dev

如何将字符串附加到对象属性?

Related 相关文章

  1. 1

    如何在Swift中将字符附加到字符串?

  2. 2

    解析XML时如何防止将\ n附加到NSmutable字符串?

  3. 3

    Python将*。*附加到字符串

  4. 4

    在将字符串添加到XML之前对字符串进行消毒?

  5. 5

    如何使用DOMDocument更改xml源

  6. 6

    java将cdata添加到xml字符串

  7. 7

    如何在bash中将日期附加到字符串

  8. 8

    PHP DOMDocument:如何合并xml字符串?

  9. 9

    如何在不使用字符串比较的情况下使用node.js快速将节点附加到XML文件中

  10. 10

    如何在elasticsearch中将字符附加到字符串?

  11. 11

    如何附加到字符串?

  12. 12

    将Xml字符串添加到Xml节点

  13. 13

    如何将分号(;)附加到cmake字符串

  14. 14

    DOMDocument没有定义吗?将数据保存到XML

  15. 15

    如何在Xcode中将变量附加到字符串

  16. 16

    将xml DOMDocument转换为HTML字符串并回显

  17. 17

    如何将属性附加到字符串?

  18. 18

    将片段附加到字符串

  19. 19

    在将字符串添加到XML之前对字符串进行消毒?

  20. 20

    如何在没有直接ID引用的情况下从Strings.xml获取字符串数组的ID

  21. 21

    如何将字符串内容附加到数组

  22. 22

    将变量附加到字符串

  23. 23

    如何使用exiftool将字符串附加到标签

  24. 24

    如何在不转义CDATA节点值的情况下将Node对象转换为XML字符串?

  25. 25

    如何使用javascript将字符串附加到textarea

  26. 26

    使用 DOMDocument 将新节点及其子节点添加到 XML 文档

  27. 27

    如何在没有 .xml 和资源的情况下将字符串添加到微调器

  28. 28

    无法在python中使用lxml将gml字符串附加到xml

  29. 29

    如何将字符串附加到对象属性?

热门标签

归档