【问题标题】:How to get the whole XML elements of a particular namespace with their tags?如何使用标签获取特定命名空间的整个 XML 元素?
【发布时间】:2011-01-03 19:55:59
【问题描述】:

我找不到这样的具体问题,所以我发布了。希望这将是通用的。

我有一个包含“<w:t> data data.....</w:t>”的 XML 标签的文件。还有很多其他的东西。我需要捕获<w:t></w:t> 标签内(包括)的所有内容。

我很高兴听到有关如何进行的建议。

提前谢谢..

大卫

【问题讨论】:

  • 你应该使用真正的 XML 解析器(比如 DOM 等),而不是 hacks
  • 关于使用 PHP 解析 XML 文件并捕获其中的数据的问题有很多。 stackoverflow.com/search?q=%5Bphp%5D+xml+parsing
  • 谢谢大家。这是从(350 页)MSWord 文档的一次性转换,我希望最终成为 xml 或 mysql 文件。
  • 可能重复? xml parsing with php

标签: php xml-namespaces xml-parsing


【解决方案1】:

你真的应该使用像SimpleXML这样的XML DOM解析器:

$string = '<?xml version="1.0"?>
<root xmlns:w="http://example.com/">
    <w:t>some data...</w:t>
    <not-captured>data data</not-captured>
    <w:t>more data...</w:t>
</root>';
$doc = simplexml_load_string($string);
foreach ($doc->xpath('//w:t') as $elem) {
    var_dump($elem->asXML());
}

如果您没有在 XML 文档中为 w 指定命名空间,请使用 SimpleXMLElement::registerXPathNamespace:

$doc->registerXPathNamespace('w', 'http://example.com/');

【讨论】:

    【解决方案2】:

    除了上一个答案之外,我会在最后的 i 之后包含一个小写的 's' 以处理换行符。

    Gumbo 先生的观点很好。是的,还要在 's' 之后添加一个大写的 'U' 以使表达式不那么贪婪,否则它将无法按预期工作

    例如

    preg_match_all('/.*/isU', $string, $matches);

    【讨论】:

    • 对不起,我错过了:。表示除换行符以外的任何字符。 /s 修饰符抑制该行为并且 .陷阱新行
    • 使用正则表达式很不错
    • 我有很多东西要学,谢谢大家的参与。现在我有了我的 - 非常粗糙 - 但符合标准的 XML 文件,我必须弄清楚如何将子标签分配给特定元素。这些元素是希腊语,所以这并不容易..
    【解决方案3】:

    使用 DomXml 是首选选项,因为它不会限制您搜索其他标签/数据。

    但是使用正则表达式可以减少代码,所以如果这些标签只是你需要的,我会选择 preg_match_all。

    $string = '<?xml version="1.0"?>
    <root>
        <w:t>some data...</w:t>
        <not-captured>data data</not-captured>
        <w:t>more data...</w:t>
    </root>
    </xml>';
    
    preg_match_all('/<w\:t>.*<\/w\:t>/is', $string, $matches);
    var_dump($matches);
    

    回复:

    array(1) {
      [0]=>
      array(2) {
        [0]=>
        string(23) "<w:t>some data...</w:t>"
        [1]=>
        string(23) "<w:t>more data...</w:t>"
      }
    }
    

    编辑:/is 修饰符添加到正则表达式

    【讨论】:

    • 谢谢你,Ivan...我明白了..我无法在此处发布脚本,因为我是菜鸟,但它与您的代码一致..
    • 你不会得到那个结果,因为* 是贪婪的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2022-01-22
    • 2014-09-14
    • 1970-01-01
    • 2013-06-19
    • 2022-07-06
    相关资源
    最近更新 更多