2013-10-19 7 views
2

PHP의 Simplexml로 구문 분석하는 XML 파일이 있지만 노드를 통한 반복 문제가 있습니다.Simplexml 객체 노드 반복

는 XML :

<channel> 
    <item> 
    <title>Title1</title> 
    <category>Cat1</category> 
    </item> 
    <item> 
    <title>Title2</title> 
    <category>Cat1</category> 
    </item> 
    <item> 
    <title>Title3</title> 
    <category>Cat2</category> 
    </item> 
</channel> 

내 계산 기능 :

public function cat_count($cat) { 
    $count = 0; 
    $items = $this->xml->channel->item; 
    $size = count($items); 

    for ($i=0; $i<$size; $i++) { 
     if ($items[$i]->category == $cat) { 
      $count++; 
     } 
    } 
    return $count; 
} 

내가 내 코드에서 오류가 내려다 보이는 건가요, 또는 노드를 통해 반복에 대한 또 다른 바람직한 방법은 무엇입니까? 나는 또한 foreach와 while 문을 운을 사용하지 않았으므로 잃어 버렸습니다. 어떤 제안?

편집 : 아래의 XPath는 방법을 사용하는 동안, 나는

foreach ($this->xml->channel->item as $item) { 
    echo $item->category; 
} 

를 사용하여 사용하여, 모든 카테고리 이름을 인쇄 만 할 것으로 나타났습니다

foreach ($this->xml->channel->item as $item) { 
    if ($item->category == $cat) { 
     echo $item->category; 
    } 
} 

에만 두 배로 카테고리의 인스턴스를 인쇄합니다 . 선을 복사하여 붙여 넣은 경우에도 하나만 표시됩니다. 이것은 XML 구조가 어떻게 든 무효가 될 수 있다는 것을 의미합니까?

+0

죄송합니다 끔찍한 서식. 내 모바일이 편집자와 잘 어울리지 않습니다. 그에 맞게 수정하십시오. – MorbidWrath

+0

항목이 여러 번 반복되므로 반복해야하거나 $ this-> xml-> channel-> item [0], $ this-> xml-> channel-> item [1] 등으로 참조해야합니다. –

+0

나는 실제로하고있다. 그냥 잘못 입력 했어. 코드를 업데이트했습니다. – MorbidWrath

답변

1

XML 파일에서 주어진 이름의 요소를 계산하는 쉬운 방법은 xpath를 사용하는 것입니다. 이 시도 :

private function categoryCount($categoryName) { 
    $categoryName = $this->sanitize($categoryName); // easy xpath injection protection 
    return count($this->xml->xpath("//item[category='$categoryName']")); 
} 

살균() 함수는 XPath는 주입을 방지하기 위해 $categoryName에서 단일 및 이중 따옴표를 제거해야합니다. 당신은 XML 데이터를 완벽하게 제어 할 수없는 경우

// xpath in case of single quotes in category name 
$xpath = '//item[category="' . $categoryName . '"]'; 

// xpath in case of double quotes in category name 
$xpath = "//item[category='" . $categoryName . "']"; 

: 또한 작업에 따옴표를 포함하는 카테고리 이름에 대한 쿼리를 얻으려면, 당신은 작은 따옴표 나 큰 따옴표가 포함되는 왼손에 따라 당신의 XPath 쿼리 문자열을 구축해야 (예를 들어 사용자가 생성 한 콘텐츠로 만들어진 경우)이를 고려해야합니다. 불행히도 매개 변수가있는 쿼리와 같은 PHP에서는이 작업을 수행 할 수있는 간단한 방법이 없습니다.

는 PHP는 XPath는 기능 문서 여기를 참조하십시오 http://php.net/manual/en/simplexmlelement.xpath.php

는 XPath 참고 여기를 참조하십시오 http://www.w3schools.com/xpath/xpath_syntax.asp

+0

그 정보 주셔서 감사합니다. 나는 아직도이 상황에서 작동하도록 할 수는 없지만 클래스의 다른 메소드에서이를 활용할 것이다. 나는 약간의 업데이트 된 디버그 정보로 원래의 게시물을 편집하려고한다. – MorbidWrath

+0

죄송합니다, 내 대답에 약간의 버그가있었습니다 : xpath 표현식의 $ categoryName 작은 따옴표로 있어야했습니다. http://writecodeonline.com/php/에서 테스트 해 보았는데 지금은 좋아 보인다. –

+1

게시 한 코드에 XPath 삽입이 발생하기 쉽습니다. 이것은 경험이 풍부한 프로그래머와 관련이없는 질문이므로, xpath를 제안하면 대답에서이 중요한 질문을 건너 뛰지 마십시오. 참고 : [* PHP에서 XPath 인젝션 공격 완화] (http://hakre.wordpress.com/2013/07/11/mitigating-xpath-injection-attacks-in-php/) 또한 기존 Stackoverflow 답변에 대한 참조를 제공합니다. 이 주제에 관한. – hakre