2008-10-29 7 views
3

값이 공백 인 addChild를 값 (또는 공백을 포함하여)으로 호출하면 no 노드 만 추가하는 대신 중복 된 SimpleXml 노드가 노드 내부에 추가되는 것으로 보입니다 값. 여기 빈 문자열이있는 addChild - 중복 노드

빠른 무슨의 데모입니다 :

[description] => !4jh5jh1uio4jh5ij14j34io5j! 

그리고 여기에 빈 문자열입니다 :

[description] => SimpleXMLElement Object ([0] =>) 

내가 지금 사용하고 해결 방법은 꽤 끔찍 - 내가하고 있어요 대체 할 마지막 JSON의 str_replace! 4jh5jh1uio4jh5ij14j34io5j! 빈 문자열로. 왝. 아마도 유일한 해결책은 'simplexml에 버그 보고서를 제출하는 것'입니다. ...

더 좋은 해결책이있는 사람이 있습니까?

답변

0

어쩌면 나는 당연한 질문을 이해하지 못 하겠지만, addChild 메소드를 사용할 때 내용이 무엇이든 관계없이 노드의 이름에 대한 인수로 문자열을 가져야한다고 생각됩니다. 노드 값 (두 번째 인수)은 선택 사항이며 비어있는 노드를 추가하고 비워 둘 수 있습니다.

도움이되는지 알려주세요.

1

나는 무슨 일이 일어나고 있는지 알았습니다. 이 같은 감안할 코드 :

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node','value'); 
print_r($xml); 

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node',''); 
print_r($xml); 

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node'); 
print_r($xml); 

출력은 이것이다 : 사례 # 2 빈 요소가 생성되지 않도록

그래서
SimpleXMLElement Object 
(
    [node] => value 
) 
SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
      [0] => 
     ) 

) 
SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
     ) 

) 

, 그것을 만들 (당신이 모르는 즉 경우 두 번째 인수가 빈 문자열 여부를) 될 것입니다, 당신은 이런 식으로 뭔가를 할 수 :

$mystery_string = ''; 

$xml = new SimpleXMLElement('<xml></xml>'); 
if (preg_match('#\S#', $mystery_string)) // Checks for non-whitespace character 
    $xml->addChild('node', $mystery_string); 
else 
    $xml->addChild('node'); 

print_r($xml); 
echo "\nOr in JSON:\n"; 
echo json_encode($xml); 

출력하려면 :

SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
     ) 

) 

Or in JSON: 
{"node":{}} 

원하는 것이 맞습니까?

개인적으로 필자는 결코 이상한 행동으로 인해 결코 절대로 SimpleXML을 사용하지 않습니다. 아직 개발이 진행 중이고 PHP5에서 DOM 조작을 수행하는 데 필요한 메소드의 2/3이 빠졌습니다 (예 : deleteChild , replaceChild 등).

DOMDocument (libxml2에 대한 인터페이스이기 때문에 표준화되고 신속하며 기능이 완벽합니다)를 사용합니다.

0

DOMDocument에있는 기능적으로 모두 포함하도록 simpleXml 객체를 확장하는 XML 라이브러리를 만들었지 만 SimpleXml의 인터페이스가 없습니다. 두 함수가 동일한 기본 libxml2 객체와 상호 작용하므로 - 참조로). 또한 AsArray() 또는 AsJson()과 같이 객체를 해당 형식 중 하나로 출력 할 수 있습니다.

JSON을 출력 할 때 예상대로 작동하도록 라이브러리를 업데이트했습니다.당신은 다음을 수행 할 수 있습니다

$xml = new bXml('<xml></xml>'); 
$xml->addChild('node', ''); 
$json_w_root = $xml->asJson(); // is { 'xml': {'node':'' } } 
$json = $xml->children()->asJson(); // is { 'node' : '' } as expected. 

라이브러리는 당신이 인 print_r() 또는 위해서 var_dump()를 사용하는 경우, 수) (직렬화 또는 유사한 것을 SimpleXML을 가진 http://code.google.com/p/blibrary/

+1

트릭은 JSON 인코딩 전에 simpleXML 객체를 배열에 캐스트하는 것입니다. – null

1

에서 구글 코드에서 호스팅되는 내부 개체에 저장된 내용과 일치하지 않습니다. PHP가 내용을 중재하는 방식에 과부하를주는 '마법의'객체입니다.

AsXML() 만 사용하여 요소의 실제 표현을 얻을 수 있습니다.

print_r()과 같은 것이 SimpleXML 요소를 반복하거나 -> 연산자를 사용하여 해당 속성에 액세스하면 무언가의 객체 버전을 갖게됩니다. 이 munged 버전을 사용하면 "echo $ xml-> surname"또는 $ xml-> names [1]과 같은 작업을 수행 할 수 있습니다. 실제로 이러한 속성이 속성으로 포함되어 있지만 실제로 포함 된 XML과 구분됩니다. 꼭 필요한 것은 아니며 이름이 PHP 예약어 (예 : "var") 인 요소는 속성으로 표시되지 않지만 $ xml [ "var"] 같은 코드로 액세스 할 수 있습니다 - 객체가 연관 배열 인 것처럼 . 여러 형제 요소의 이름이 같은 경우 배열과 같이 표시됩니다. 나는 빈 문자열이 어떤 이유로 든 배열처럼 제시되는 것 같다. 그러나 AsXML()을 사용하여 출력 할 때 실제 표현을 얻을 수 있습니다.

관련 문제