문제

HTML 내용을 가져와야합니다 answer 이 비트의 XML에서 :

<qa>
 <question>Who are you?</question>
 <answer>Who who, <strong>who who</strong>, <em>me</em></answer>
</qa>

그래서 나는 "누가, u003Cstrong>누가u003C/strong> , 나, u003Cem>나u003C/em> "라는 현을 얻고 싶다.

내가 있다면 answer A로 SimpleXMLElement, 나는 전화 할 수있다 asXML() "u003Canswer> 누가, u003Cstrong>누구u003C/strong> , u003Cem>나u003C/em>u003C/answer> "하지만 요소 자체가 포장되지 않은 요소의 내부 XML을 얻는 방법은 무엇입니까?

나는 문자열 함수를 포함하지 않는 방법을 선호하지만 그것이 유일한 방법이라면 그렇게하십시오.

도움이 되었습니까?

해결책

내가 아는 한, 그것을 얻을 수있는 내장 방법은 없습니다. 시도하는 것이 좋습니다 단순한, 이것은 대부분의 일반적인 문제에 대한 편의 방법을 제공하는 SimplexMlement를 확장하는 PHP 클래스입니다.

include 'SimpleDOM.php';

$qa = simpledom_load_string(
    '<qa>
       <question>Who are you?</question>
       <answer>Who who, <strong>who who</strong>, <em>me</em></answer>
    </qa>'
);
echo $qa->answer->innerXML();

그렇지 않으면, 나는 그렇게하는 두 가지 방법을 본다. 첫 번째는 당신을 변환하는 것입니다 SimpleXMLElement a DOMNode 그런 다음 그 위에 루프 childNodes XML을 구축합니다. 다른 하나는 전화하는 것입니다 asXML() 그런 다음 문자열 함수를 사용하여 루트 노드를 제거하십시오. 그래도 관심, asXML() 때로는 실제로 마크 업을 반환 할 수 있습니다 밖의 XML Prolog 또는 처리 지침과 같은 노드에서 호출되었습니다.

다른 팁

function SimpleXMLElement_innerXML($xml)
  {
    $innerXML= '';
    foreach (dom_import_simplexml($xml)->childNodes as $child)
    {
        $innerXML .= $child->ownerDocument->saveXML( $child );
    }
    return $innerXML;
  };

이것은 작동합니다 (정말 절름발이 보이지만) :

echo (string)$qa->answer;

가장 간단한 솔루션은 간단한 XML을 사용하여 사용자 정의 Get InnerXML을 구현하는 것입니다.

function simplexml_innerXML($node)
{
    $content="";
    foreach($node->children() as $child)
        $content .= $child->asXml();
    return $content;
}

코드에서 교체하십시오 $body_content = $el->asXml(); ~와 함께 $body_content = simplexml_innerXML($el);

그러나 InnerXML (찾고있는 것)과 outerxml (지금 얻는 것)을 구별하는 다른 API로 전환 할 수도 있습니다. Microsoft Dom Libary는 이러한 구별을 제공하지만 불행히도 PHP Dom은 그렇지 않습니다.

PHP XMLREADER API 가이 분류를 제공한다는 것을 알았습니다. readinnerxml ()을 참조하십시오. 이 API는 XML을 처리하는 데 상당히 다른 접근법이 있습니다. 시도 해봐.

마지막으로, XML은 데이터를 하위 트리로 추출하는 것이 아니라 값으로 추출한다고 강조합니다. 그렇기 때문에 올바른 API를 찾는 데 어려움을 겪습니다. HTML 서브 트리를 XML 하위 트리가 아닌 값으로 (및 모든 태그를 탈출)하는 것이 더 '표준'일 것입니다. 또한 일부 HTML Synthax는 항상 XML 호환되는 것은 아닙니다 (즉
vs,
). 어쨌든 실제로는 접근 방식이 XML 파일을 편집하는 데 더 편리합니다.

SimplexMlelement 클래스를 확장했을 것입니다.

class MyXmlElement extends SimpleXMLElement{

    final public function innerXML(){
        $tag = $this->getName();
        $value = $this->__toString();
        if('' === $value){
            return null;
        }
        return preg_replace('!<'. $tag .'(?:[^>]*)>(.*)</'. $tag .'>!Ums', '$1', $this->asXml());
    }
}

그런 다음 다음과 같이 사용하십시오.

echo $qa->answer->innerXML();
<?php
    function getInnerXml($xml_text) {           
        //strip the first element
        //check if the strip tag is empty also
        $xml_text = trim($xml_text);
        $s1 = strpos($xml_text,">");        
        $s2 = trim(substr($xml_text,0,$s1)); //get the head with ">" and trim (note that string is indexed from 0)

        if ($s2[strlen($s2)-1]=="/") //tag is empty
            return "";

        $s3 = strrpos($xml_text,"<"); //get last closing "<"        
        return substr($xml_text,$s1+1,$s3-$s1-1);
    }

    var_dump(getInnerXml("<xml />"));
    var_dump(getInnerXml("<xml  /  >faf <  / xml>"));
    var_dump(getInnerXml("<xml      ><  / xml>"));    
    var_dump(getInnerXml("<xml>faf <  / xml>"));
    var_dump(getInnerXml("<xml  >  faf <  / xml>"));      
?>

잠시 동안 검색 한 후에는 솔루션을 만족하지 못했습니다. 그래서 나는 내 자신의 기능을 썼습니다. 이 함수는 정확하게 나타납니다 innerXml 내용 (물론 흰색 공간 포함). 그것을 사용하려면 함수의 결과를 전달하십시오. asXML(), 이와 같이 getInnerXml($e->asXML()). 이 기능은 많은 접두사가있는 요소에 대해 작동합니다 (다른 접두사의 모든 자식 노드에서 변환하는 현재 방법을 찾을 수 없으므로).

산출:

string '' (length=0)    
string '' (length=0)    
string '' (length=0)    
string 'faf ' (length=4)    
string '  faf ' (length=6)
    function get_inner_xml(SimpleXMLElement $SimpleXMLElement)
    {
        $element_name = $SimpleXMLElement->getName();
        $inner_xml = $SimpleXMLElement->asXML();
        $inner_xml = str_replace('<'.$element_name.'>', '', $inner_xml);
        $inner_xml = str_replace('</'.$element_name.'>', '', $inner_xml);
        $inner_xml = trim($inner_xml);
        return $inner_xml;
    }

CDATA 섹션을 제거하지 않으려면 6-8 행에 주석을주십시오.

function innerXML($i){
    $text=$i->asXML();
    $sp=strpos($text,">");
    $ep=strrpos($text,"<");
    $text=trim(($sp!==false && $sp<=$ep)?substr($text,$sp+1,$ep-$sp-1):'');
    $sp=strpos($text,'<![CDATA[');
    $ep=strrpos($text,"]]>");
    $text=trim(($sp==0 && $ep==strlen($text)-3)?substr($text,$sp+9,-3):$text);
    return($text);
}

이 기능 만 사용할 수 있습니다 :)

function innerXML( $node )
{
    $name = $node->getName();
    return preg_replace( '/((<'.$name.'[^>]*>)|(<\/'.$name.'>))/UD', "", $node->asXML() );
}

Regex를 사용하면이 작업을 수행 할 수 있습니다

preg_match(’/<answer(.*)?>(.*)?<\/answer>/’, $xml, $match);
$result=$match[0];
print_r($result);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top