当前位置: 首页 > 面试题库 >

具有连字符名称的SimpleXML Reading节点

濮阳征
2023-03-14
问题内容

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<gnm:Workbook xmlns:gnm="http://www.gnumeric.org/v10.dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gnumeric.org/v9.xsd">
  <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.1">
    <office:meta>
      <dc:creator>Mark Baker</dc:creator>
      <dc:date>2010-09-01T22:49:33Z</dc:date>
      <meta:creation-date>2010-09-01T22:48:39Z</meta:creation-date>
      <meta:editing-cycles>4</meta:editing-cycles>
      <meta:editing-duration>PT00H04M20S</meta:editing-duration>
      <meta:generator>OpenOffice.org/3.1$Win32 OpenOffice.org_project/310m11$Build-9399</meta:generator>
    </office:meta>
  </office:document-meta>
</gnm:Workbook>

并且正在尝试阅读office:document-meta节点以提取其下面的各种元素(dc:creator,meta:creation-date等)。

如下代码:

$xml = simplexml_load_string($gFileData);
$namespacesMeta = $xml->getNamespaces(true);
$officeXML = $xml->children($namespacesMeta['office']);
var_dump($officeXML);
echo '<hr />';

给我:

object(SimpleXMLElement)[91]
  public 'document-meta' => 
    object(SimpleXMLElement)[93]
      public '@attributes' => 
        array
          'version' => string '1.1' (length=3)
      public 'meta' => 
        object(SimpleXMLElement)[94]

但是如果我尝试使用以下方法读取document-meta元素

$xml = simplexml_load_string($gFileData);
$namespacesMeta = $xml->getNamespaces(true);
$officeXML = $xml->children($namespacesMeta['office']);
$docMeta = $officeXML->document-meta;
var_dump($docMeta);
echo '<hr />';

我懂了

Notice: Use of undefined constant meta - assumed 'meta' in /usr/local/apache/htdocsNewDev/PHPExcel/Classes/PHPExcel/Reader/Gnumeric.php on line 273
int 0

我假设SimpleXML试图从$ officeXML中提取一个不存在的节点“文档”,然后减去(不存在的)常量“元”的值,导致强制使用整数0而不是文档元节点。

有没有一种方法可以使用SimpleXML来解决此问题,还是会被迫使用XMLReader重写?任何帮助表示赞赏。


问题答案:

您的假设是正确的。采用

$officeXML->{'document-meta'}

使它工作。

请注意,以上内容适用于Element节点。属性节点(转储SimpleXmlElement时位于@attributes属性内的属性节点)在连字符后不需要访问任何特殊语法。可以通过数组符号定期访问它们,例如

$xml = <<< XML
<root>
    <hyphenated-element hyphenated-attribute="bar">foo</hyphenated-element>
</root>
XML;
$root = new SimpleXMLElement($xml);
echo $root->{'hyphenated-element'}; // prints "foo"
echo $root->{'hyphenated-element'}['hyphenated-attribute']; // prints "bar"

有关更多示例,请参见手册中的SimpleXml基础



 类似资料:
  • 问题内容: 我正在尝试从XML提取一些数据,但是当我执行以下命令时,我得到了一个 警告:为…中的foreach()提供了无效的参数 代码示例: 对于单个单词的节点名称,它可以很好地工作,所以我猜它不喜欢连字符。我需要逃脱吗? 问题答案: 从PHP 手册: 访问XML文档中包含PHP命名约定不允许的字符的元素(例如,连字符)可以通过将元素名称封装在花括号和撇号中来实现。 您的情况是:

  • 我正在为学校制作一种API,用于定制XML编写器。我有: 我需要帮助的是: 我想创建一个与数据[i]同名的元素。 我使用的是dom4jxml。顺便说一句,放在这个罐子里。 我听说过一种叫做hashmap的方法,如果这是正确的方法,请有人解释一下如何使用它。

  • 我正在使用Node.js程序将数据插入MongoDB数据库。我已将数据插入到名为“repl-failOver”的集合中。 当我使用Mongo shell并使用< code>show collections列出数据库中的集合时,我能够看到集合“repl-failOver”。 如何从mongoshell为这个集合运行查找命令?

  • 问题内容: 我有一个产品目录,正在使用Elastica客户端在ElasticSearch中建立索引。我是ElasticSearch BTW的新手。 我的目录中有一些名称相同的产品。但是,如果输入,它们将不会出现在搜索结果中。 我该怎么办才能弹出结果? 我已经按照本教程进行了学习,并为索引实现了以下内容: 问题答案: 您可以尝试使用映射字符过滤器删除连字符: http://www.elasticse

  • 问题内容: 可能这个问题之前已经回答过,但我找不到。 我使用的是2/3岁的MySQL数据库,其列名称中带有连字符。当我尝试从Java代码中使用这些名称时,这些名称在连字符处被打乱(例如air_port变为air),因此找不到。我尝试在代码中将连字符替换为下划线,希望数据库可以平等地对待它们,但这行不通。 如何转义连字符或如何访问这些列?这可能是所使用的字符集的问题吗? 问题答案: 将名称括在中

  • 问题内容: ava类名称中哪些字符有效?还有哪些其他规则管理Java类名称(例如,Java类名称不能以数字开头)? 问题答案: 你几乎可以使用任何字符,包括大多数Unicode字符!确切的定义在Java语言规范的3.8:标识符一节中。 一个标识符是无限长序列的Java字母和爪哇位,其中第一个必须是一个爪哇字母。… 字母和数字可能来自整个Unicode字符集,…这允许程序员在使用其母语编写的程序中使