使用PHP提取XML信息

时间:2015-08-02 21:34:52

标签: php xml mediawiki-templates

我有一个奇怪的格式化XML文件,我想提取<text xml:space="preserve" bytes="1099">部分并将该信息转换为自己的数组。

我认为我必须找到|分界和分裂,但不太确定如何做到这一点。

  <page>
    <title>Martial Ares</title>
    <ns>0</ns>
    <id>23026</id>
      <sha1>7imznp2a51dh3kslf5gtqnkpkidlvom</sha1>
    <revision>
      <id>79960</id>
      <timestamp>2014-02-25T07:24:27Z</timestamp>
      <contributor>
        <username>JScathach</username>
        <id>8024930</id>
      </contributor>
        <text xml:space="preserve" bytes="1017">{{Infobox card (2)
            |card name=[Martial] Ares
            |character name=Ares
            |release_date=May 1 2013
            |image 1=MartialAres5.jpg
            |rarity 1=Super Special Rare
            |pwr req 1=28
            |sale price 1=94200
            |max card lv 1=60
            |max mastery lv 1=40
            |quote 1=Ares prefers weapons that were used during the age of Greek myth: sword, axe, and spear.  But he can use any weapon expertly, and turn most ordinary objects into lethal weapons.
            |base atk 1=2440
            |base def 1=2650
            |max atk 1=7015
            |max def 1=7613
            |mastery bonus atk 1=915
            |mastery bonus def 1=993
            |image 2=MartialAres6.jpg
            |rarity 2=Ultimate Rare
            |sale price 2=188400
            |max mastery lv 2=200
            |quote 2=Next time I see Hercules, We're going to have a steel conversation. It's about time for him to answer for massacring my Stymphalian Birds.
            |max atk 2=9822
            |max def 2=10660
            |mastery bonus atk 2=1098
            |mastery bonus def 2=1192
            |alignment=Bruiser
            |ability=Warhawk
            |gender=Male
            |usage=Average
            |faction=Super Hero
            |effect=Significantly harden DEF of your Bruisers.
            |centretrait=None
            }}
            __NOWYSIWYG__
      </text>
    </revision>
  </page>

2 个答案:

答案 0 :(得分:2)

您可以通过这种方式获取文字:

$xml = simplexml_load_string($string);
$text = $xml->revision->text;

答案 1 :(得分:1)

  

我认为我必须找到|在那一点划界和分裂,但不太确定如何做到这一点。

PHP的基于libxml的库(包括 SimpleXMLElement DOMDocument )及其默认选项确实保留了问题的 text 元素中的空格所以在这一点上你应该遇到一点问题。

对于编码到 text 元素text-value中的格式,这是 Mediawiki 语法,并且在开始时它的最大部分为Infobox Template

{{Infobox
 | title = Top level title
 | data1 = {{Infobox | decat = yes | child = yes
    | title = First subsection
    | label1= Label 1.1
    | data1 = Data 1.1
   }}
 | data2 = {{Infobox | decat = yes | child = yes
  |title = Second subsection
  | label1= Label 2.1
  | data1 = Data 2.1
  }}
 | belowstyle = 
 | below = Below text
}}

嵌入式使用的信息框模板示例

信息框模板遵循通用模板语法来命名模板并为其提供(命名或未命名)参数。您可以在Usage Syntax section of Help:Template中找到此信息。由于Mediawiki本身是用PHP编写的,因此您甚至可以找到与解析这些模板代码within it's source相关的PHP代码。它显示了如何以比帮助页面更严格的方式解析这些数据,但是由于它的源代码采用了一种模块化和结构化的方式,因此它更加复杂。根据您的程序员类型,它可能会让您感到不堪重负,因为它需要阅读技能和有关PCRE正则表达式的知识。

从目前为止我所看到的是你需要先提取(递归){{ ... }}块。在这些内容中,您可以解析标题以及可选的任意数量(命名或未命名)参数。用于分隔这些字段的分隔符是|。我不能说这些分隔符是否可以或者它们是如何被转义的,也无法说出字段和名称是否可以使用多行值 - 在示例旁边显示一个值可以是另一个模板然后可以是多线。