仅从返回的数据中获取XML内容

时间:2013-04-09 23:36:08

标签: php xml xml-parsing

我完全坚持如何处理这个问题。基本上我有一个curl调用,返回一个xml以及其他信息,我需要做的是基本上只获取返回数据的xml部分,并将其设置为一个单独的变量我猜。例如,

  array(
    ['name']='john',
    ['location']='california',
  )

  <?xml version="1.0"?>
     <data>
       <name>somename</name>

    </data>

   array(
    ['name']='john',
    ['location']='california',
  )

  array(
    ['name']='john',
    ['location']='california',
  )

所以我只想要整个数据的XML部分。我没有尝试任何东西,因为我甚至不知道从哪里开始,有人可以帮助我。

3 个答案:

答案 0 :(得分:4)

作为前奏,重要的是要注意无论你做什么,这几乎肯定是错误的方法。您应该尝试操作生成此数据的应用程序,以便以严格定义的格式生成数据。

就本答案而言,我认为在这种情况下是不可能的。


很明显,答案是使用正则表达式从其余数据中提取XML。

但是,尝试提供此正则表达式的其他答案对于通用用例来说都不够好。这就是我要做的事情:

@
    (?:<\?xml.*?\?>\s*)?             # optionally match the XML declaration
    <([^/]\S*)[^>]*>                 # match opening tag and capture the tag name
    (?:                              # group alternates together
        (?>                          # atomic group for efficiency
            (?:(?!</?[^/>]+[^/]>).)+ # match everything up to the next long tag
        )
      | (?R)                         # ...or a recursive match of the expression
    )*                               # ...zero or more times
    </\1>                            # match the closing tag
@isx

这一点至关重要,假设您正在寻找的XML格式正确。重要的是要注意,除非您100%确定要搜索的XML格式正确,否则您不应该,并且在很大程度上可以不使用正则表达式。

如果是这种情况,此表达式将匹配嵌套在给定字符串中的任何完整XML文档,并且能够处理陷阱,例如标记名称与文档元素和自闭标记匹配的元素。

See it working

答案 1 :(得分:1)

试试这个:

$result = "
  array(
    ['name']='john',
    ['location']='california',
  )

  <?xml version=\"1.0\"?>
     <data>
       <name>somename</name>

    </data>

   array(
    ['name']='john',
    ['location']='california',
  )

  array(
    ['name']='john',
    ['location']='california',
  )
";

$matches = array();
preg_match('/<\?xml(.*)<\/data>/is', $result, $matches);

var_dump(reset($matches));

答案 2 :(得分:0)

您应该能够使用正则表达式来检测XML标头(<?xml version="1.0"?>)和根元素(<data>)。一旦你有了,你只需要检测结束标记(</data>)并瞧!小麦与谷壳分开!