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

让SimpleXMLElement在输出中包含编码

  •  17
  • dirtside  · 技术社区  · 15 年前

    这是:

    $XML = new SimpleXMLElement("<foo />");
    echo($XML->asXML());
    

    ...输出如下:

    <?xml version="1.0"?>
    <foo/>
    

    但我希望它也能输出编码:

    <?xml version="1.0" encoding="UTF-8"?>
    <foo/>
    

    有没有办法告诉SimpleXMLElement包含<的编码属性;?xml>标签除此之外:

    $XML = new SimpleXMLElement("<?xml version='1.0' encoding='utf-8'?><foo />");
    echo($XML->asXML());
    

    这是可行的,但手动指定版本和编码很烦人。

    为了回答这个问题,假设我不能使用DOMDocument。

    5 回复  |  直到 15 年前
        1
  •  23
  •   Cristian Toma    15 年前

    你可以试试这个,但你必须使用 simplexml_加载_字符串 售价$xml

    $xml // Your main SimpleXMLElement
    $xml->addAttribute('encoding', 'UTF-8');
    

    或者,您仍然可以使用其他方法将编码添加到输出中。

    简单替换

    $outputXML=str_replace('<?xml version="1.0"?>', '<?xml version="1.0" encoding="UTF-8"?>', $outputXML);
    

    正则表达式

    $outputXML=preg_replace('/<\?\s*xml([^\s]*)\?>/' '<?xml $1 encoding="UTF-8"?>', $outputXML);
    

    DOMDocument - 我知道你说过你不想使用DOMDocument,但这里有一个例子

    $xml=dom_import_simplexml($simpleXML);
    $xml->xmlEndoding='UTF-8';
    $outputXML=$xml->saveXML();
    

    您可以将此代码包装到一个函数中,该函数接收参数$encoding并将其添加到

        2
  •  13
  •   DarckBlezzer RichieHindle    8 年前

    简单明了,只有这样做

    $XMLRoot = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8"?><element></element>');
    

    输出

    <?xml version="1.0" encoding="UTF-8"?>
          <element></element>
    

    要在element only中添加属性,请使用

    $XMLRoot->addAttribute('name','juan');
    

    添加儿童用途

    $childElement = $XMLRoot->addChild('elementChild');
    $childElement->addAttribute('attribName','somthing');
    
        3
  •  2
  •   LevinM    7 年前

    DOMDoc的提案 Cristian Toma 如果文件不太重,这似乎是一个很好的方法。你可以用这样的方式来概括:

    private function changeEncoding(string $xml, string $encoding) {
        $dom = new \DOMDocument();
        $dom->loadXML($xml);
        $dom->encoding = $encoding;
        return $dom->saveXML();
    }
    

    当您无法访问生成xml的序列化程序时,它非常有用。

        4
  •  1
  •   Toby Allen mercator    15 年前

    我想说的是,在创建每个XML对象时都需要这样做。即使SimpleXMLElement有一种设置它的方法,您仍然需要设置它,因为我猜对象可能会选择一个有效的默认值。

    也许创建一个常数,然后创建这样的对象

    $XML = new SimpleXMLElement($XMLNamespace . "<foo />");
    echo($XML->asXML());
    
        5
  •  0
  •   TML    15 年前

    如果不指定编码,SimpleXML无法(理智地)猜测您想要的编码。