【问题标题】:Parse XML file for specific tag to get the content of a sibling tag解析特定标签的 XML 文件以获取同级标签的内容
【发布时间】:2016-11-26 05:08:25
【问题描述】:

我有这个 XML 文件:

   <page>
      <title>test</title>
      <text>bla bla</text>
   </page>
   <page>
      <title>another test</title>
      <text>bla bla</text>
    </page>
    <page>
      <title>hello</title>
      <text>hello world</text>
    </page>

我想解析文件(PHP SAX解析器)找到标题为“hello”的页面,然后保存对应的Text标签内容..我目前做的是这样的:

   $pages = array();
   $elements  = null;

   function startElements($parser, $name, $attrs) {
      global $wiki, $elements;

      if(!empty($name)) {
        $elements = $name;
      }
   }

   function endElements($parser, $name) {
      global $elements;

      if(!empty($name)) {
         $elements = null;
      }
   }

   function characterData($parser, $data) {
      global $pages, $elements;

      if(!empty($data)) {
         if ($elements == 'TITLE' ) {
            if((preg_match('/Hello/', $data)==1))
             { 

                 // ... I found the page with the good title, but how to get the following text tag content!!

             }
         }
      }
   }

   $parser = xml_parser_create(); 

   xml_set_element_handler($parser, "startElements", "endElements");
   xml_set_character_data_handler($parser, "characterData");

  if (!($handle = fopen('tmp.xml', "r"))) {
      die("could not open XML input");
   }

   while($data = fread($handle, 4096)) {
      xml_parse($parser, $data);  
   }

关于如何使用特定的 Titles 标签获取 Text 标签的内容有什么想法吗?我可以通过将所有数据保存在一个数组中来获得我需要的结果..然后搜索!但我想要一个更好的解决方案。

谢谢。

【问题讨论】:

标签: php xml xml-parsing sax saxparser


【解决方案1】:

好的,我找到了一个解决方案,它不像我想要的那样基于 SAX 解析器,但仍然适用于大文件。它结合了 SimpleXML(DOM 解析器)和 XMLReader(基于流的解析器)。 SimpleXML 允许轻松访问子节点。

使用 XMLReader,数据一次传递一个元素,使用 扩张()。使用此方法,您可以转换 XMLReader 传递的节点 到 DOMElement,然后到 SimpleXML。

两者结合的细节可以在这里找到:http://www.ibm.com/developerworks/library/x-xmlphp2/

我希望这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多