공백

2014-11-01 3 views
0

교체 나는이 XML 정보를 분석하려고 :공백

<text:p >Lorem<text:s/>ipsum.</text:p> 

을 따라서 내가 XMLReader를 사용하고 있습니다. 거의 모든 것이 내가 필요로하는대로 작동하고 있습니다. 그러나 < 텍스트 : s /> 요소가 나를 위해 약간의 문제를 만듭니다. 난 그냥 텍스트를 얻기 위해 내가 expand()->textContent을 사용하고 서식 태그 (즉, 굵은 글씨)를 제거하려는 것처럼 '. 로렘 입숨'

$reader = new XMLReader(); 
if (!$reader->open("content.xml"); 
while ($reader->read()) { 
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:p') echo utf8_decode($reader->expand()->textContent); 
} 

내가 얻을 것이 경우를 'Lorem ipsum'대신에. 모든 < 텍스트를 공백으로 대체하려면 어떻게합니까 : s/> 공백이 있어야합니다.

업데이트 : 내가 이런 식으로했다 : preg_replace("/<\\/?text:s(\\s+.*?>|>)/", " ", utf8_decode($reader->readInnerXML()))

업데이트 :

내가 구문 분석에 대한 DOMDocument를 사용하고 있다면 어떻게 구문을 변경해야합니까?

$reader = new DOMDocument(); 
$reader->load("zip://folder/".$file.".odt#content.xml"); 

while ($reader->read()){ 
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:h') { 
     if ($reader->getAttribute('text:outline-level')=="2") $html .= '<h2>'.$reader->expand()->textContent.'</h2>'; 
    } 
    elseif ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:p') { 
     if ($reader->getAttribute('text:style-name')=="Standard") { 
      $str = $reader->readInnerXML(); 
      // replace text:s-elements with " " at this point 
     } 
    } 
} 
+0

'$ string = str_replace ("", ""$ string); 또는 $ string = str_replace ("", "\ n", $ string); ' –

+0

' textContent'는 다른 태그가없는 문자열로 연결됩니다. 따라서 텍스트 : s- 태그는 if 절에서 이미 제거되었습니다. 그게 내 문제 야. – user3142695

+0

그런 다음'echo utf8_decode ($ reader-> expand() -> textContent)를 시도해보십시오. ""; "또는'echo utf8_decode ($ reader-> expand() -> textContent). "\ n"; - 또는'. ""닫는 괄호 안쪽에. –

답변

1

당신은 <text:p> 요소를 출력하지 않는다, 그러나 당신은 출력 단지 텍스트 노드 원하는 단지 공간으로 <text:s> 요소 :

$reader = new XMLReader(); 
$result = $reader->open("content.xml"); 
if (!$result) { 
    throw new UnexpectedValueException('Could not open XML file for reading.'); 
} 

while ($reader->read()) { 
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:s') { 
     echo " "; // SPACE 
    } 
    if ($reader->nodeType == XMLREADER::TEXT) { 
     echo $reader->textContent; 
    } 
} 

그래서 더이 문제입니다 처리 논리 및 덜 기술적 인 문제 XMLReader.

내 예에서 왼쪽으로 한 문자 인코딩의 일부 주 :

당신이 UTF-8로 출력을 제공하는 경우 (utf8_decode)은 일반적으로 필요는 없습니다 않는 라틴어-1 변환. Character encodings을 참조하십시오.

타겟 출력이 필요한 경우 그 위치에서 처리해야 할 필요는 거의 없습니다 (ob_iconv_handler 참조).

+0

흥미로운 대답에 감사드립니다. 파일에는 텍스트 : h 및 텍스트 : p 요소가 있습니다.이 요소는 다르게 처리해야합니다. 이 질문에서 필자는 텍스트의 일부인 p 노드를 설명했습니다. 그래서 나는 XMLREADER :: TEXT만을 사용할 수 없다고 생각한다. 그리고 네, 인코딩 문제가 있습니다 : ODT 파일에는 독일어 움라우트, em 대시, 터키 문자 또는 ie 같은 문자가 있습니다. 'μ'. utf8_decode를 사용하려고했지만 때때로 '?'가 나타납니다. 일부 문자가 올바르게 변환되기 때문에 약간 이상합니다. – user3142695

+0

은 utf-8에 집착합니다. 디코딩하지 마십시오. ** XMLReader ** 대신 ** DOMDocument **를 사용하여 파일을 구문 분석하십시오. – hakre

+0

게시물을 업데이트했습니다. DOMDocument 시도하고 싶습니다,하지만 그 구문에 몇 가지 문제가 ... 당신이 도울 수 있다면 좋을 것입니다. – user3142695