>  기사  >  백엔드 개발  >  XML - XPATH 구문 소개

XML - XPATH 구문 소개

黄舟
黄舟원래의
2017-02-24 15:19:041426검색


xpath가 왜 필요한가요?

dom4j를 사용하면 여러 레이어에서 요소를 얻을 수 없으며 레이어별로 가져와야 하는데 이는 매우 번거로운 작업입니다.
따라서 특정 노드에 더 편리하게 접근하기 위해 xpath 기술을 사용하면 특정 노드를 매우 편리하게 읽을 수 있습니다.

xpath는 일반적으로 dom4j와 함께 사용됩니다. xpath를 사용하려면 새 패키지 jaxen-1.1-beta-6.jar을 도입해야 합니다

xpath의 기본 구문은 다음과 같습니다.

1. 기본 xpath 구문은 파일 시스템에서 파일을 찾는 것과 비슷합니다. 슬래시 /Start로 시작하면 경로는 요소에 대한 절대 경로를 나타냅니다.

(1)/AAA은 루트 요소 AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里

선택을 나타냅니다. (2)/AAA/CCC, AAA

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>

의 모든 CCC 하위 요소 선택을 나타냅니다. (3) /AAA/DDD/BBB, AAA

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>
그렇다면 dom4j에서 xpath를 어떻게 사용하나요? 실제로는 매우 간단합니다.

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();
//2.指定去解析哪个文件Document document = saxReader.read(new File(path));
//3.可以使用xpath随心读取// document.selectNodes(args)返回多个元素
// document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");

dom4j를 통해 문서 개체를 가져온 후 문서의

메서드를 사용할 수 있습니다. 이 메서드는 작성한 xpath 경로에 따라 selectNodes(args)를 반환합니다. dom4j와 유사합니다. List

동시에 단일 Node를 반환하는

메서드도 있습니다. selectSingleNode(args)


다음은 계속해서 다른 xpath 구문을 소개합니다.

2. 경로가 이중 슬래시 로 시작하면 문서의 모든 파일이 이중 슬래시 충족 //후속 규칙의 요소(계층 관계에 관계 없음) //

(1)

, 이는 모든 BBB 요소를 선택한다는 의미 //BBB

<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>

(2)

, 모든 상위 요소를 의미 DDD //DDD/BBB

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>


의 BBB 요소입니다. 3. 별표 는 별표 * 앞의 경로에 있는 모든 요소를 ​​선택한다는 의미입니다.

(1)

, 경로가 /AAA/CCC/DDD에 연결된 모든 요소를 ​​선택함을 의미: /AAA/CCC/DDD/*

<AAA>
    <XXX>
        <DDD>
            <BBB/>
            <BBB/>
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>这里            
            <FFF/>这里        
            </DDD>
    </CCC>
    <CCC>
        <BBB>
            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>

(2)

, 다음을 포함하는 모든 BBB 요소를 의미 3개의 상위 요소 /*/*/*/BBB

<AAA>
    <XXX>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </CCC>
    <CCC>
        <BBB>这里            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>

(3)

, 이는 모든 요소 선택을 의미합니다. //*


4. 대괄호 안의 표현식은 요소를 추가로 지정할 수 있습니다. 는 선택 세트 위치의 요소 수를 나타내고, last() 함수는 선택 세트의 마지막 요소를 나타냅니다. 여기서 첨자는 0이 아닌 1부터 시작한다는 점에 유의하는 것이 중요합니다! (1)
, AAA의 첫 번째 BBB 하위 요소 선택을 의미 /AAA/BBB[1]

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>

(2)

, AAA의 마지막 BBB 요소 /AAA/BBB[last()]

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>
선택을 의미 AAA


5. 속성에 대한 작업

(1)

, 모든 id 속성을 선택합니다. 참고: 모든 id 속성은 노드로 반환되지만 그렇지 않습니다. id 속성이 있는 노드를 반환합니다. //@id

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>

(2)

, ID 속성이 //BBB[@id]

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>

(3)

인 모든 BBB 노드를 선택하고, 이름 속성이 //BBB[@name]

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

( 4)

, //BBB[@*]

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(5)

속성이 있는 모든 BBB 노드를 선택하고, //BBB[not(@*)]

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>


속성이 없는 모든 BBB 노드를 선택합니다. 6의 값 속성을 선택 기준으로 사용할 수 있습니다

(1)

, 속성 ID가 포함된 BBB 요소를 선택하고 해당 값은 'b1' //BBB[@id='b1']

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>


7.선택한 요소 수를 계산하는 기능count()

(1)

, 2개의 BBB 하위 요소가 포함된 요소 선택//*[count(BBB)=2]

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>

(2)

, 하위 요소 2개를 포함하는 요소 선택//*[count(*)=2]

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>

많은 함수 적용을 포함하여 그 밖에도 많은 구문이 있지만 많이 사용되지 않으며 여기서는 소개하지 않습니다


또한 위에 소개된 구문 포인트는 다음 xml 문서와 같이 어떤 방식으로든 결합될 수 있습니다.

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>

이제 첫 번째 BBB 하위 요소를 찾고 싶다고 가정합니다. AAA 요소 아래 아래 두 번째 CCC 하위 요소의 KKK 하위 요소에 대해 xpath 경로는 다음과 같이 작성되어야 합니다.


/AAA/BBB[1]/CCC[2]/KKK

xpath가 필요한 이유

dom4j를 사용할 때 레이어를 교차할 수 없습니다. 특정 요소를 얻으려면 레이어별로 얻어야 ​​하는데 매우 번거롭습니다.

따라서 특정 노드에 더 편리하게 접근하기 위해 xpath 기술을 사용하면 특정 노드를 매우 편리하게 읽을 수 있습니다.

xpath는 일반적으로 dom4j와 함께 사용됩니다. xpath를 사용하려면 새 패키지 jaxen-1.1-beta-6.jar을 도입해야 합니다

xpath의 기본 구문은 다음과 같습니다.

1. 기본 xpath 구문은 파일 시스템에서 파일을 찾는 것과 비슷합니다. 슬래시 Start로 시작하면 경로는 요소에 대한 절대 경로를 나타냅니다. /

(1)

은 루트 요소 AAA/AAA

<AAA>这里    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/><AAA/>这里

선택을 나타냅니다. (2)

, AAA의 모든 CCC 하위 요소 선택을 나타냄 /AAA/CCC

<AAA>
    <BBB/>
    <CCC/>这里    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>
    <DDD/>
    <CCC/>这里<AAA/>

(3)

, AAA DDD의 모든 BBB 하위 요소 선택을 나타냄 /AAA/DDD/BBB

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <BBB/>
    <DDD>
        <BBB/>这里    <DDD/>
    <CCC/><AAA/>

那么怎么在dom4j中运用xpath呢?其实很简单:

//1.得到SAXReader解析器SAXReader saxReader = new SAXReader();
//2.指定去解析哪个文件Document document = saxReader.read(new File(path));
//3.可以使用xpath随心读取
// document.selectNodes(args)返回多个元素
// document.selectSingleNode(args)返回单个元素List nodes = document.selectNodes("/AAA/BBB");

通过dom4j得到document对象后,可以使用document的selectNodes(args)方法,这个方法会根据你写的xpath路径返回一个List,余下的操作就和dom4j类似了。

同时它也有一个selectSingleNode(args)方法,用于返回一个单个的Node。


下面继续介绍其他的xpath语法:

2.如果路径以双斜线//开头,则表示文档中所有满足双斜线//之后规则的元素(无论层级关系)

(1)//BBB,它表示选择所有BBB元素

<AAA>
    <BBB/>这里    <CCC/>
    <BBB/>这里    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>

(2)//DDD/BBB,表示所有父元素是DDD的BBB元素

<AAA>
    <BBB/>
    <CCC/>
    <BBB/>
    <DDD>
        <BBB/>这里    </DDD>
    <CCC>
        <DDD>
            <BBB/>这里            <BBB/>这里        </DDD>
    </CCC></AAA>

3.星号*表示选择所有由星号之前路径所定位的元素

(1)/AAA/CCC/DDD/*,它表示选择所有路径依附于/AAA/CCC/DDD的元素:

<AAA>
    <XXX>
        <DDD>
            <BBB/>
            <BBB/>
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>这里            
            <FFF/>这里        
            </DDD>
    </CCC>
    <CCC>
        <BBB>
            <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>

(2)/*/*/*/BBB,它表示所有的有3个祖先元素的BBB元素

<AAA>
    <XXX>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </XXX>
    <CCC>
        <DDD>
            <BBB/>这里            
            <BBB/>这里            
            <EEE/>
            <FFF/>
        </DDD>
    </CCC>
    <CCC>
        <BBB>这里            
        <BBB>
                <BBB/>
            </BBB>
        </BBB>
    </CCC></AAA>

(3)//*,它表示选择所有的元素


4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0!
(1)/AAA/BBB[1],它表示选择AAA的第一个BBB子元素

<AAA>
    <BBB/>这个    <BBB/>
    <BBB/>
    <BBB/></AAA>

(2)/AAA/BBB[last()],表示选择AAA的最后一个BBB元素

<AAA>
    <BBB/>
    <BBB/>
    <BBB/>
    <BBB/>这个</AAA>

5.对属性的操作

(1)//@id,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。

<AAA>
    <BBB id="b1"/>返回这里的id属性节点    <BBB id="b2"/>也返回这里的id属性节点    <BBB name="bbb"/>
    <BBB/></AAA>

(2)//BBB[@id],选择所有有id属性的BBB节点

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>也返回这个BBB节点    <BBB name="bbb"/>
    <BBB/></AAA>

(3)//BBB[@name],选择所有有name属性的BBB节点

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(4)//BBB[@*],选择所有有属性的BBB节点

<AAA>
    <BBB id="b1"/>返回这个BBB节点    <BBB id="b2"/>返回这个BBB节点    <BBB name="bbb"/>返回这个BBB节点    <BBB/></AAA>

(5)//BBB[not(@*)],选择所有没有属性的BBB节点

<AAA>
    <BBB id="b1"/>
    <BBB id="b2"/>
    <BBB name="bbb"/>
    <BBB/>这个</AAA>

6.属性的值可以被用来作为选择的准则

(1)//BBB[@id='b1'],选择含有属性id且其值为’b1’的BBB元素

<AAA>
    <BBB id="b1"/>这个    <BBB name="bbb"/>
    <BBB name="bbb"/></AAA>

7.count()函数可以计数所选元素的个数

(1)//*[count(BBB)=2],选择含有2个BBB子元素的元素

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>
        <CCC/>
        <DDD/>
    </EEE></AAA>

(2)//*[count(*)=2],选择含有2个子元素的元素

<AAA>
    <CCC>
        <BBB/>
        <BBB/>
        <BBB/>
    </CCC>
    <DDD>返回这个元素        <BBB/>
        <BBB/>
    </DDD>
    <EEE>也返回这个元素        <CCC/>
        <DDD/>
    </EEE></AAA>

还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍


另外,上述介绍的几点语法可以任意组合,比如下述的xml文档:

<AAA>
    <BBB id="b1">
        <CCC>
            <KKK>k1</KKK>
        </CCC>
        <CCC>
            <KKK>k2</KKK>这个        </CCC>
    </BBB>
    <BBB id="b2"/>
    <BBB name="bbb"/></AAA>

假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写:
/AAA/BBB[1]/CCC[2]/KKK


 以上就是XML——XPATH语法介绍 的内容,更多相关内容请关注PHP中文网(www.php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.