Java

Java XML - xsd location path

승모근뭉치 2023. 1. 19. 12:33

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <!-- location path
        '/' - 루트 노드 | 구분자
        
        절대경로 : 
        /A/B/C/D
        상대경로(현재 A노드에서 D노드를 찾아가는 경우) : 
        ./B/C/D 또는 B/C/D
        
        여기서 B,C,D,A 를 location step(location path 를 구성하는 요소)
        
        - location step 작성 형식(요와같은형태로쓰면해당노드를찾아갈수있다)
            Axis::NodeTest[Predicate]
            
            Axis - 노드를 찾기 위한 검색방향을 지정
            NodeTest - 찾고자 하는 노드이름
            Predicate - 필터링하기위한 표현식을 의미
        
        Axis 종류: ancestor(조상축), ancestor-or-self, parent(부모축), self, attribute, child, descendant(자손들축), descendant-or-self,
                  preceding, preceding-sibling, following, following-sibling
        
        [NodeTest에 올 수 있는 것들: 엘리먼트명, 속성명, 함수 등이 올 수 있다.]
        
        Axis::엘리먼트명    (지정된 축에서 해당 엘리먼트명을 갖는 노드를 선택한다.)
        Axis::속성명       (지정된 축에서 해당 속성명을 갖는 노드를 선택한다.)
        Axis::*          (지정된 축의 모든 엘리먼트의 노드들을 선택한다.)
        Axis::접두사:*     (지정된 네임스페이스 접두사를 갖는 모든 노드를 선택한다.)
        Axis::접두사:로컬이름(지정된 네임스페이스 접두사를 갖고 로컬이름과 동일한 노드를 선택한다.)
        Axis::node()     (지정된 축의 모든 노드(엘리먼트 노드, 텍스트노드)들을 선택한다.)
        Axis::comment()  (지정된 축의 모든 주석 노드들을 선택한다.)
        Axis::text()     (지정된 축의 텍스트 노드를 선택한다.)
        Axis::processing-instruction()    (지정된 축의 processing-instruction 노드들을 선택)
        
        사용예>  descendant::book = 자손노드중에서 book 노드를 가리키는 location step을 의미
               child::title = 자식 노드 중에서 title 노드를 가리키는 location step을 의미
               attribute::id = 속성 노드 중에서 id노드를 가리키는 location step을 의미
               
        [Predicate에 올수 있는 표현식]
         : NodeTest에서 선택된 노드 중에서 특별한 노드를 선택하기 위한 필터링과 관련된 표현식을 의미
         
        Axis::노드명[조건문 또는 (true또는 false를 반환하는 함수)]
         :지정된 축에서 조건문 또는 함수의 반환값이 true가 되는 노드명만 필터링된다.
         
        조건문에서 사용하는 연산자들
        . 사칙연산 : + - * div(나눗셈), mod(나머지연산자)
        . 비교연산 : < > <= >=
        . 등가비교 : =, !=
        . 논리연산 : AND, OR
        
        일반적으로 많이 사용하는 Predicate 표현식
            . Axis::노드명[child::노드명 = "값"] - 자식 노드명의 콘텐트 내용이 주어진 값과 동일한 노드명 선택
            . Axis::노드명[attribute::속성명="값"] - 속성명의 속성값이 주어진값과 동일한 노드명 선택
            . Axis::노드명[contains(child::노드명, "값")] - 자식 노드명의 콘텐트가 주어진 값을 포함하고 있는 노드명 선택
            
        - 단축형 location step
        
          축의이름을 생략한다.
          location path가 길어지는 것을 방지하기 위해서 축의 이름을 생략해서 사용할 수 있는데
          이것을 단축형 location step 이라고 한다.
          
          단축형식
          . child::엘리먼트명                          >>>> 엘리먼트명 (축을 생략하고 노드명만 적는 방식)
          . /child::엘리먼트명/child::엘리먼트명          >>>>> /엘리먼트명/엘리먼트명
          . /child::엘리먼트명[child::엘리먼트명="값"]     >>>> /엘리먼트명[엘리먼트명="값"]
          . attribute::속성명                          >>>> @속성명
          . /child::엘리먼트명/attribute::속성명          >>>> /엘리먼트명/@속성명
          . descendant-or-self::엘리먼트명              >>>> //엘리먼트명
          . child::엘리먼트명/descendant-or-self::엘리먼트명        >>>> /엘리먼트명//엘리먼트명
          . self::node()                             >>>> .
          . parent::node()                           >>>> ..
          . child::엘리먼트명/parent::node()/child::엘리먼트명    >>>> /엘리먼트명/../엘리먼트명
    -->
    
    
</xs:schema>