代码之家  ›  专栏  ›  技术社区  ›  Parapluie

使用PHP将冒号写入XML

  •  0
  • Parapluie  · 技术社区  · 6 年前

    我尝试使用simpleXML从PHP输出一个XML文件。我遇到了“:”(冒号)字符的问题。(谈论艺术模仿生活!)

    是否有任何方法可以避开冒号,以便将元素添加到对象中?

    这是我的代码:

    $urlset->addAttribute('xmlns','http://www.sitemaps.org/schemas/sitemap/0.9');
    

    此行通过正常,因此只有属性名失败,如下面的示例所示:

    $urlset->addAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
    $urlset->addAttribute('xsi:schemaLocation','http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd');
    

    在每种情况下,它去掉“:”前面的任何内容,如下所示:

    <urlset 
        xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
        xsi="http://www.w3.org/2001/XMLSchema-instance" 
        schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
    >
    

    同样,我的问题不在于从XML读取/解析“:”,而在于从PHP将“:”写入XML。在'net'上有很多关于解析的内容,但是我在从php编写“:”的过程中没有发现。

    1 回复  |  直到 6 年前
        1
  •  2
  •   notesville    6 年前

    您似乎无法使用simpleXML 定义 将在文档中使用的命名空间(即 xmlns 属性可以)。我发现您可以在根节点的声明中简单地指定它们,如下所示:

    $simpleXml = new SimpleXMLElement('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"></urlset>');
    

    在构建站点地图的情况下,您可能不必担心设置任何名称空间。但是,对于更通用的解决方案,它定义了一个默认名称空间和一个带前缀的第二个名称空间。 alt .

    $simpleXml = new SimpleXMLElement('<root xmlns="http://default.namespace.com" xmlns:alt="http://alt.namespace.com"></root>');
    
    $simpleXml->addChild("child", "node in the default namespace");
    $simpleXml->addChild("other", "node in the alternate namespace", "http://alt.namespace.com");
    
    print $simpleXml->asXML();
    

    将产生:

    <root xmlns="http://default.namespace.com" xmlns:alt="http://alt.namespace.com">
      <child>node in the default namespace</child>
      <alt:other>node in the alternate namespace</alt:other>
    </root>
    

    第三个可选参数 addAttribute 可以帮助您使用该名称空间创建属性或节点的命名空间。请注意,您需要使用 网址 名称空间(而不是前缀)。