2011-02-28 3 views
6

저는 XPath를 처음 사용하는 사람입니다. 데이터베이스 대신 단순한 포트폴리오 웹 사이트에 전력을 공급하기 위해 XML 방식을 사용하고 싶습니다.이 경우 데이터베이스 요소가 프로젝트 자체 일 뿐이므로 불필요합니다.Xpath를 사용하여 특정 하위 요소가있는 XML 노드를 찾으십시오.

나는 다음과 같은 구조를 갖는 XML 파일을 작성했습니다 : 이제

<?xml version="1.0" encoding="UTF-8" ?> 
<projects> 
    <project> 
     <title>A-Merchandise</title> 
     <slug>a-merchandise</slug> 
     <projectType>E-commerce</projectType> 
     <launchDate>2007-08-01</launchDate> 
    </project> 
    ... 

, 나는 목록 개요에 대한 PHP이 XML 파일의 벌금을 구문 분석 할 수 있습니다,하지만 난 XPath에와 필터링 프로젝트에 대해 어떻게 가야합니까? 예를 들어 노드 projectType 노드가 e-commerce 인 모든 project 노드를 얻으려면 어떻게해야합니까? 는 XPath에 상응하는 무엇 일 것

SELECT * FROM `projects` WHERE `category` = 'e-commerce'; 

:

일반적으로, 나는 같은 SQL 쿼리를 실행할 것인가? 이 필터링에 적합한 XML 파일이 올바른 구조에 있습니까?

모든 포인터가 좋을 것입니다. 미리 감사드립니다.

+0

은 아마도 질문에 관련이없는,하지만 목적에, 당신은이 sqlite를 사용하여 고려 했는가? 데이터베이스 엔진은 응용 프로그램과 동일한 프로세스 공간에서 초기화되고 데이터베이스 파일은 "* .db"형식으로 저장됩니다. Sqlite는 PHP 바인딩을 가지고 있으며 다른 데이터베이스 엔진과 마찬가지로 SQL 문을 보낼 수 있습니다. 이 링크를 체크 아웃하십시오 : –

+0

@de costo - 나는 다음 사람만큼 SQLite를 좋아하지만 완전히 주제를 벗어납니다 ... 어떻게 sqlite를 사용하지 않는지 어떻게 알 수 있습니까? –

+0

@Byron - 저자의 파일 저장 목적에 대한 옵션으로 제안되었습니다. 필자가 생각하기에 .db 파일을 가지고 정보를 저장하는 XML 파일은 필요 없다. –

답변

6

에 당신의 XML 파일 이름을 고려로 foo.xml이며, 바 같은 디렉토리에 있습니다.

/projects/project[projectType="e-commerce"] 

[] 필터가 나는 또한 발견 한 값 "e-commerce"

projectType 아이를 projects 아래의 모든 project 요소를 선택 : 내용을

$projects = simpleXMLElement('foo.xml',null,true); 

$ecomProjects = $projects->xpath('project[projectType="E-commerce"]'); 

foreach($ecomProjects as $ecomProject) 
{ 
echo $ecomProject; // or do whatever with it 
} 
2

xpath에서 뼈대를 올리면 매우 유용합니다. 비록 내가 일반적으로 w3cshools을 좋아하지는 않지만, 그들의 xpath docs은 꽤 좋다.

$doc = new DOMDocument(); 
$xpath = new DOMXpath($doc); 

foreach ($xpath->query("/projects/project") as $node) 
{ 
    if ($node->textContent == "e-commerce") 
    { 
    // this node is the one you want. 
    } 
} 

또는 슬래시 즉 //nodeYouWant 이중으로 어디서나 문서 접두사에서 노드를 선택하려면 순수 XPath는에게

foreach ($xpath->query("/projects/project[projectType = 'e-commerce']") as $node) 
    { 
     // grab the $node 
    } 

일부 포인터

를 사용하여. 속성을 선택하려면 @/nodeName[@attribute='attributeValue'] 구문을 사용하십시오.

+0

XPath에 p/1'contains()'함수가 없습니다 ... –

+0

@Alejandro - 정확하고 업데이트되었습니다. –

0

W3schools은 좋은 출발점입니다.

은 아마 프로젝트의 속성에 projectType을 변경하고 다음과 같이 선택합니다 :

//project[@projectType ='e-commerce'] 
2

: 그것은 XML 문서에 XPath를 사용하여 아주 좋은 자원을 가지고

//project[projectType='E-commerce'] 

을 XPath를 (http://www.w3.org/TR/xpath/#predicates)의 문서에서,이 예제가있다 :

chapter[title="Introduction"] 하나 이상의 title 아이들있는 콘텍스트 노드의 자식을 선택 chapter 동일 string-valueIntroduction

+0

스키마가 잘 알려진 경우에는'//'연산자를 시작할 필요가 없습니다. –

+0

+1 스펙 인용. –

관련 문제