在PHP中使用XML命名空间将XML转换为json


convert xml to json in php with xml namespace

我有一个xml像下面的xmlns -

  <ChannelInfo xmlns="Vijayabank_43_vijayBank1">
  <RegionName xmlns="Vijayabank_43_vijayBank1_Prime">
    <Width xmlns="Width">768</Width>
    <Height xmlns="Height">614</Height>
    <Top xmlns="Top">100</Top>
    <Left xmlns="Left">20</Left>
    <Audio xmlns="Audio">1</Audio>
  </RegionName>
  <RegionName xmlns="Vijayabank_43_vijayBank1_SubPrime">
    <Width xmlns="Width">452</Width>
    <Height xmlns="Height">614</Height>
    <Top xmlns="Top">100</Top>
    <Left xmlns="Left">808</Left>
    <Audio xmlns="Audio">0</Audio>
  </RegionName>
 <RegionName xmlns="Vijayabank_43_vijayBank1_Banner1">
   <Width xmlns="Width">1240</Width>
   <Height xmlns="Height">54</Height>
   <Top xmlns="Top">714</Top>
   <Left xmlns="Left">20</Left>
   <Audio xmlns="Audio">0</Audio>
 </RegionName>
</ChannelInfo>

我想把它转换成json,就像下面用xmlns在php -

  "ChannelInfo": {
   "-xmlns": "Vijayabank_43_vijayBank1",
   "RegionName": [
     {
       "-xmlns": "Vijayabank_43_vijayBank1_Prime",
       "Width": {
       "-xmlns": "Width",
       "#text": "768"
     },
       "Height": {
        "-xmlns": "Height",
        "#text": "614"
     },
     "Top": {
       "-xmlns": "Top",
       "#text": "100"
     },
     "Left": {
       "-xmlns": "Left",
       "#text": "20"
     },
     "Audio": {
       "-xmlns": "Audio",
       "#text": "1"
     }
   },
   {
     "-xmlns": "Vijayabank_43_vijayBank1_SubPrime",
     "Width": {
       "-xmlns": "Width",
       "#text": "452"
     },
     "Height": {
      "-xmlns": "Height",
      "#text": "614"
    },
     "Top": {
       "-xmlns": "Top",
       "#text": "100"
     },
     "Left": {
       "-xmlns": "Left",
      "#text": "808"
    },
    "Audio": {
      "-xmlns": "Audio",
       "#text": "0"
     }
   },
   {
    "-xmlns": "Vijayabank_43_vijayBank1_Banner1",
    "Width": {
      "-xmlns": "Width",
      "#text": "1240"
    },
    "Height": {
      "-xmlns": "Height",
      "#text": "54"
    },
    "Top": {
      "-xmlns": "Top",
      "#text": "714"
    },
    "Left": {
      "-xmlns": "Left",
      "#text": "20"
    },
    "Audio": {
      "-xmlns": "Audio",
      "#text": "0"
     }
   }
   ]
   }
   } 

我已经尝试过simple_load_string(),它抛出警告,如命名空间警告:xmlns: URI DailyXml不是绝对的。我想要xmlns属性

如何解决这个问题?还有别的办法吗?

目前您只是将XML序列化为JSON。您需要读取数据并将其转换为您想要的JSON:

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
$channel = $dom->documentElement;
$result = [
  'id' => $channel->namespaceURI,
  'Regions' => []
];
foreach ($xpath->evaluate('*', $channel) as $region) {
  $regionId = $region->namespaceURI;
  $result['Regions'][$regionId] = [];
  foreach ($xpath->evaluate('*', $region) as $property) {
    $result['Regions'][$regionId][$property->namespaceURI] = 
      trim($property->textContent);
  }
}
echo json_encode($result, JSON_PRETTY_PRINT);

输出:https://eval.in/154181

{
    "id": "Vijayabank_43_vijayBank1",
    "Regions": {
        "Vijayabank_43_vijayBank1_Prime": {
            "Width": "768",
            "Height": "614",
            "Top": "100",
            "Left": "20",
            "Audio": "1"
        },
        "Vijayabank_43_vijayBank1_SubPrime": {
            "Width": "452",
            "Height": "614",
            "Top": "100",
            "Left": "808",
            "Audio": "0"
        },
        "Vijayabank_43_vijayBank1_Banner1": {
            "Width": "1240",
            "Height": "54",
            "Top": "714",
            "Left": "20",
            "Audio": "0"
        }
    }
}

XML是相当损坏的。xmlns属性定义元素的名称空间。名称空间是定义元素的格式。(如(X)HTML, Atom,…)

在XML中,xmlns就像ChannelInfo和RegionName元素上的"id"或"name"属性一样使用。标识文档中元素的东西。

在其他元素节点上,它只是无用的重复数据。该信息已经包含在元素名称中。

更好的XML:

<Channel xmlns="http://domain.tld/ns/ads" id="Vijayabank_43_vijayBank1">
  <Region id="Vijayabank_43_vijayBank1_Prime">
    <Width>768</Width>
    <Height>614</Height>
    <Top>100</Top>
    <Left>20</Left>
    <Audio>1</Audio>
  </Region>
  ...
</Channel>