【问题标题】:Remove number in xml tag删除 xml 标签中的数字
【发布时间】:2014-01-24 12:54:48
【问题描述】:

你好, 我正在尝试从直接连接到 php 中的服务器后台的 python 脚本解析数据。为此,我将接收到的数组转换为 JSON,然后在 php 脚本中将其转换为 XML,以便使用 file_get_html 在另一台服务器上解析它。一切都很好,但标签问题。基本上标签的编号如

<item0></item0><item1></item1>...

如果我使用

foreach($html->find('item') as $element) 

我什么也没找到。

有没有办法解析所有以 item 开头的标签,或者至少将所有类型的字符串转换为(即使这样当然会减慢处理速度,但无论如何..)或在各个阶段适当地更改 php 或 python 中的所有相关字符串名称?

谢谢,法布里齐奥

【问题讨论】:

    标签: php python xml json string


    【解决方案1】:

    首先不要将 XML 加载为 HTML。这可以摧毁它。

    可以获取所有以定义的字符串开头的标签。

    $xml =  <<<'XML'
    <items>
      <item0></item0>
      <item1></item1>
    </items>
    XML;
    
    $dom = new DOMDocument();
    $dom->loadXml($xml);
    $xpath = new DOMXpath($dom);
    
    $nodes = $xpath->evaluate('//*[starts-with(local-name(), "item")]');
    foreach ($nodes as $node) {
      var_dump($node->getNodePath());
    }
    

    但是你为什么要给标签编号呢?您知道 XML 允许您拥有具有相同元素名称的兄弟姐妹吗?

    <items>
      <item>...</item>
      <item>...</item>
      ...
    </items>
    

    此结构的 Xpath 将是 /items/item

    或者,如果您希望将 JSON 中的数组保留在 XML 中,请使用简单的名称,例如 _ 来表示子元素:

    { 
      "title" : "foo",
      "items" : [ 1 , 2, 3 ]
    }
    
    <json>
      <title>foo</title>
      <items>
        <_>1</_>
        <_>2</_>
        <_>3</_>
      </items>
    </json>
    

    此结构的 Xpath 将是 /json/items/* 或特定项目 /json/items/*[2]

    【讨论】:

    • 事实上,我想用 file_get_html 解析它以构建一个带有一些更改标签的新 XML。从你写的接缝来看,在 $node->getNodePath() 我得到了各种 itemn 标签内的内容,这就是我要找的。我会尝试并告诉你。
    • 不幸的是,它不起作用:正如您在 miafoto.it/iPhone/inarrivo/php/OO/… 看到的那样,结果为空,而如果您调用显示的 url,则您有正确的源 xml 来解析。当然,我不确定项目标签是否应该是第一个字符串,因为目前并非如此。我也会测试一下。
    • 现在它更干净了,但项目标签有点嵌入:PARTIGIANI (FS)PLE DEI PARTIGIANI, 20 M. CIRCA PRIMA CIV。 33 CORSIA SX LATO PARCHEGGIO AREA 巴士 - CAPOLINEA 121PARTIGIANI (FS)000431PARTIGIANI (FS)00043121
    • 也许从字典中获取值会更容易,即使这些值有些嵌套:我会尝试的。数组(2){...[“arrivi”]=>数组(1){[0]=>数组(8){[“non_monitorata”]=>布尔(真)[“nome_palina”]=>字符串( 15) ".." ["meb"]=> bool(false) ["aria"]=> bool(false) ["moby"]=> bool(false) ["id_palina"]=> string(5) "00043" ["pedana"]=> bool(false) ["linea"]=> string(3) "121" } } } } ["arrivi"]=> array(0) { } } }
    • 如果将 xml 加载为 html,它将删除命名空间,并且可以更改其他内容(例如添加 html 和 body 元素)。如果您有 XML 将其加载为 XML。我在示例中使用 getNodePath() 来显示匹配的元素。它为给定节点输出一个有效的 Xpath 表达式。你对节点做什么取决于你。请参阅PHP Manual 了解更多信息。
    【解决方案2】:

    物品问题已解决。 array_to_xml 显然奇怪地调用了它生成的标签。直接检查字典时不存在项目标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 2016-07-31
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多