Laravel:第 1 行第 1 列的 XML 解析致命错误:prolog 中不允许内容。prolog 中不允许包含内容

Laravel: XML Parsing Fatal Error at Line 1, Column 1: Content is not allowed in prolog. Content is not allowed in prolog

提问人:Mica 提问时间:11/7/2023 最后编辑:Mica 更新时间:11/10/2023 访问量:64

问:

我正在尝试使用Laravel在亚马逊卖家帐户中发布产品。但是我收到错误:第 1 行第 1 列的 XML 解析致命错误:prolog 中不允许内容。prolog 中不允许包含内容。这是我的代码,所以如果有人可以帮助我解决这个问题。

$requestXml = '<?xml version="1.0" encoding="utf-8"?>
        <AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
          <Header>
            <DocumentVersion>1.01</DocumentVersion>
            <MerchantIdentifier>Myid</MerchantIdentifier>
          </Header>
          <MessageType>Product</MessageType>
          <PurgeAndReplace>false</PurgeAndReplace>
          <Message>
            <MessageID>1</MessageID>
            <OperationType>Update</OperationType>
            <Product>
              <SKU>56789</SKU>
              <StandardProductID>
                <Type>ASIN</Type>
                <Value>B0EXAMPLEG</Value>
              </StandardProductID>
              <ProductTaxCode>A_GEN_NOTAX</ProductTaxCode>
              <DescriptionData>
                <Title>Example Product Title</Title>
                <Brand>Example Product Brand</Brand>
                <Description>This is an example product description.</Description>
                <BulletPoint>Example Bullet Point 1</BulletPoint>
                <BulletPoint>Example Bullet Point 2</BulletPoint>
                <MSRP currency="USD">25.19</MSRP>
                <Manufacturer>Example Product Manufacturer</Manufacturer>
                <ItemType>example-item-type</ItemType>
              </DescriptionData>
              <ProductData>
                <Health>
                  <ProductType>
                    <HealthMisc>
                      <Ingredients>Example Ingredients</Ingredients>
                      <Directions>Example Directions</Directions>
                    </HealthMisc>
                  </ProductType>
                </Health>
              </ProductData>
            </Product>
          </Message>
        </AmazonEnvelope>';

      /*$requestXml=preg_replace('/^([^\w<]+)</', '<', $requestXml);*/
      // $requestXml = trim($requestXml);
      $requestXml = preg_replace('/[[:^print:]]/', '', $requestXml);


      Log::channel('amazon')->info('Amazon create feed request: ', ['request' => $requestXml]);


      $response = Http::withHeaders([
        'Content-Type' => 'text/xml; charset=UTF-8'
      ])->put($url, [
            'body' => $requestXml
          ]);
PHP XML laravel xml-解析 amazon-selling-partner-api

评论

1赞 Álvaro González 11/7/2023
你正在做大量的预处理,知道为什么会很有用。当源数据为 ISO-8859-1 时,使用 utf8_encode(),真的是这样吗?您想剥离哪些确切的角色,为什么?
0赞 Mica 11/7/2023
嗨,这是 xml 示例 fromhttps://developer-docs.amazon.com/sp-api/docs/feeds-api-v2021-06-30-use-case-guide#step-3-upload-the-feed-data 即使我删除了 utf8_encode($requestXml) 并只留下$requestXml它 sazs 相同的错误
1赞 Álvaro González 11/7/2023
该链接没有回答我的任何问题,你也没有。现在是 2023 年,您只会在遗留系统中找到 ISO-8859-1。您的系统是否遗留?为什么要创建 XML,然后尝试在下一行中“修复”它?
0赞 Olivier 11/7/2023
更不用说它现在已被弃用。不要使用它。uft8_encode()
0赞 Yitzhak Khabinsky 11/7/2023
您的真实 XML 很可能在 XML 序言的开头具有不可见的字节顺序标记 (BOM)。请尝试删除 BOM。Notepad++ 可以在右下角的状态栏中显示 BOM,类似于 UTF-8-BOM

答:

0赞 Jenny 11/7/2023 #1

我已经修改了您的代码以验证字符串和隐藏字符,请尝试这个,并且我还删除了utf8_encode函数,因为您的 XML 字符串已经在 UTF-8 中:

$requestXml = trim($requestXml); // Remove whitespace from the beginning and end of the XML string
$requestXml = preg_replace('/[[:^print:]]/', '', $requestXml); 

// Log the XML request after cleaning it
Log::channel('amazon')->info('Amazon create feed request: ', ['request' => $requestXml]);

$response = Http::withHeaders([
  'Content-Type' => 'text/xml; charset=UTF-8'
])->put($url, [
  'body' => $requestXml
]);

评论

0赞 Mica 11/7/2023
嗨,谢谢你的帮助,但它没有用,我现在尝试了,但仍然有同样的错误,我真的不确定出了什么问题。
0赞 Jenny 11/7/2023
您是否验证了 XML 文件?如果没有,您可以使用在线验证器工具来查找隐藏的问题。
0赞 Mica 11/7/2023
是的,它是有效的 XML。我检查了。
0赞 Álvaro González 11/7/2023
XML 是在源代码中定义的,除非您有权访问源文件,否则不可能说它是否是 UTF-8。而且,可能隐藏哪些角色?
0赞 Mica 11/8/2023
我已经尝试过这样的前缀Amazon = Storage::d isk('amazon')->getDriver()->getAdapter()->getPathPrefix();$requestXml = file_get_contents($prefixAmazon .'createFeed.xml')并将xml代码放入此文件中,但出现相同的错误