소스 검색

[Serializer] Allow for more flexible element names

Jordi Boggiano 14 년 전
부모
커밋
f5f41696ec
2개의 변경된 파일22개의 추가작업 그리고 1개의 파일을 삭제
  1. 3 1
      src/Symfony/Component/Serializer/Encoder/XmlEncoder.php
  2. 19 0
      tests/Symfony/Tests/Component/Serializer/Encoder/XmlEncoderTest.php

+ 3 - 1
src/Symfony/Component/Serializer/Encoder/XmlEncoder.php

@@ -267,6 +267,8 @@ class XmlEncoder extends AbstractEncoder
      */
     protected function isElementNameValid($name)
     {
-        return $name && strpos($name, ' ') === false && preg_match('|^\w+$|', $name);
+        return $name &&
+            false === strpos($name, ' ') &&
+            preg_match('#^[\pL_][\pL0-9._-]+$#ui', $name);
     }
 }

+ 19 - 0
tests/Symfony/Tests/Component/Serializer/Encoder/XmlEncoderTest.php

@@ -53,6 +53,25 @@ class XmlEncoderTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals($expected, $this->encoder->encode($obj, 'xml'));
     }
 
+    public function testElementNameValid()
+    {
+        $obj = new ScalarDummy;
+        $obj->xmlFoo = array(
+            'foo-bar' => '',
+            'foo_bar' => '',
+            'föo_bär' => '',
+        );
+
+        $expected = '<?xml version="1.0"?>'."\n".
+            '<response>'.
+            '<foo-bar><![CDATA[]]></foo-bar>'.
+            '<foo_bar><![CDATA[]]></foo_bar>'.
+            '<föo_bär><![CDATA[]]></föo_bär>'.
+            '</response>'."\n";
+
+        $this->assertEquals($expected, $this->encoder->encode($obj, 'xml'));
+    }
+
     public function testEncodeSimpleXML()
     {
         $xml = simplexml_load_string('<firstname>Peter</firstname>');