2009-09-21 3 views
2

내 XML 파일은 다음과 같습니다.DOMDocument를 사용하여 XML 트리를 구문 분석하는 방법은 무엇입니까?

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <category> 
     <name>Category</name> 
     <desc>Category</desc> 
     <category> 
      <name>Subcategory</name> 
      <desc>Sub-category</desc> 
      <category> 
        <name>Subcategory</name> 
        <desc>Sub-category</desc> 
      </category> 
     </category> 
    </category> 
</root> 

내 트리는 가능한 한 많은 레벨을 가질 수 있습니다. 이에 대한 요구 사항은 없습니다.

첫 번째 질문 : 내 XML이 이런 종류의 요구 사항을 처리하기에 올바른가요? 및 어떻게 그것을 최적화 할 수 있습니다 (필요한 경우)

두 번째 질문 : 어떻게 DOMDocument 함께 구문 분석 할 수 있습니까?

XML 문서를로드하는 방법을 알고 있지만 구문 분석 방법을 모르겠습니다. 재귀에서 조금 읽었지만 PHP/DOMDocument로 매핑하는 방법을 제대로 이해할 수 없었습니다.

도움을 주셔서 감사합니다!

EDIT

내가 원하는 것은 범주 시스템을 관리하는 것입니다. SQL로 시도했지만 너무 중첩 된 선택, 등 관계형 모델을 사용하여 관리하기가 어려웠다 ...

그래서 내 xml

에서

에서 나무를 만들 수 있어야

내가 원하는 깊이에 대한 제한없이

  • 카테고리
    • 하위 카테고리
      • 하위 하위 카테고리

카테고리를 검색하고 모든 하위 항목 (하위 카테고리) (또는 하위 항목), 상위 항목 (하위 항목) 또는 자매 (하위 항목) 등을 검색 할 수 있습니다.

+0

XML이 W3 유효성 검사기를 사용하여 유효성 검사를 수행합니까? http://validator.w3.org/#validate_by_input – inkedmn

+0

네,하지만 경고가 2 개있는 경우, 하나는 누락 된 Doctype입니다. –

답변

1

글쎄, 여기에 사용하는 XML에는 아무런 문제가 없습니다. bu() 사용자가 원하는 것을 XML로 포착 할 것인지 여부에 대한 질 높은 응답을 제공하기 위해 누구나 데이터로 수행하고자하는 것에 대해 충분히 말하지 않습니다. "DOMDocument를 가진이 [분석]"에 관해서는, 당신이 그렇게 같이있는 DOMDocument 객체에로드 할 수 있습니다

$xml = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <category> 
     <name>Category</name> 
     <desc>Category</desc> 
     <category> 
      <name>Subcategory</name> 
      <desc>Sub-category</desc> 
      <category> 
        <name>Subcategory</name> 
        <desc>Sub-category</desc> 
      </category> 
     </category> 
    </category> 
</root> 
XML; 
$d = new DOMDocument(); 
$d->loadXML($xml); 

을이 시점에서, 문제는 다시 한 번이된다 : 이제 당신이 어떤 작업을 원하십니까?

1

이 같은 구조를 처리하는 방법에 대해 이야기하는 경우 - 전체 구조를 허용하는 함수와 카테고리 DOMNode 참조를 허용하는 함수 두 가지를 작성한다고 말하고 싶습니다. 첫 번째 함수는 초기 처리를 수행 한 다음 첫 번째 참조를 초기 Category 노드로 전달합니다. 그런 다음이 함수에서 필요에 따라 현재 노드의 속성을 처리 한 다음 자식 노드가 있으면 다시 반복합니다.

이 과정을 하나의 루프에서 처리하는 것이 더 효율적이지만 계층 구조의 문자 표현은 손실됩니다.

0

당신이 그것을하고 싶은 것에 대해 위의 요점을 되짚어 보라 ... IMHO XML의 덩어리로 할 수있는 3 가지 광범위한 클래스가있다.

DOMDocument 및로드 된 XML을 인스턴스화 한 후에는 SQL SELECT 쿼리를 사용하여 관계형 데이터베이스를 검색하는 것과 마찬가지로 XPath 쿼리를 사용하여 노드를 검색 할 수 있습니다. 노드의 특성, 노드의 하위 노드 및 노드 내의 텍스트를 추출 할 수 있습니다. 파싱의 종은 무엇입니까, 나는 말할 것입니다. DOMDocument XPath 구성 요소가이를 수행합니다.

XSL 변환을 사용하여 XML을 다른 XML 사투리, XHTML 등으로 변환 할 수 있습니다. 그 자체로 파싱이 될 수도 있고 그렇지 않을 수도 있지만 파싱이 포함됩니다. PHP XSLTProcessor 구성 요소가이를 수행합니다.

DOMDocument가 실제로 지원하지 않는 또 다른 주요 개념은 스트리밍 파서입니다. 파서는 XML을 선형 방식으로 사용하며, 그렇게하는 동안 관심있는 각 노드에서 콜백 함수를 호출합니다. SAX라는 유명한 파서는 AFAIK 원형 파싱 파서입니다. 이전에는 PHP에 SAX 파서가 있었지만 이제는 PEAR 또는 PECL로 옮겼습니다.

하지만 XML로 무엇을하고 싶습니까?

0

당신은 SQL을 사용해 본 결과 그것이 효과가 없다고 말했습니다. 팁 : Oracle을 사용하는 경우 START WITH ... CONNECT BY를 살펴보십시오. SQL Server를 사용하는 경우 재귀 CTE를 사용하십시오. 이러한 접근 방식은 문제를 해결합니다.

관련 문제