รับแอตทริบิวต์โดยใช้ XPath


344

รับโครงสร้าง XML ดังนี้:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

ฉันจะได้รับค่าของlang(ที่langเป็นengในชื่อหนังสือ) สำหรับองค์ประกอบแรก?


2
ลิงก์ที่ดีมากเมื่อใช้ xpaths test-able.blogspot.ie/2016/04/xpath-selectors-cheat-sheet.html

คำตอบ:


472

ฉันจะรับค่าของ lang (โดยที่ lang = eng ในชื่อหนังสือ) สำหรับองค์ประกอบแรกได้อย่างไร

การใช้ :

/*/book[1]/title/@lang

หมายความว่า :

เลือกlangคุณสมบัติขององค์ประกอบชื่อที่เป็นลูกของbookลูกคนแรกขององค์ประกอบด้านบนของเอกสาร XML

ในการรับค่าสตริงของคุณลักษณะนี้ให้ใช้ฟังก์ชัน XPath มาตรฐานstring() :

string(/*/book[1]/title/@lang)

3
@AbhishekAsthana ผลลัพธ์ของการประเมินนิพจน์ XPath สร้างค่าสตริงของlangแอตทริบิวต์อย่างแน่นอน หากแอตทริบิวต์นั้นไม่มีเครื่องหมายวงเล็บเหลี่ยมพวกเขาจะไม่เป็นส่วนหนึ่งของผลลัพธ์ของการประเมินผลของนิพจน์ XPath ฉันเดาว่าสิ่งเหล่านี้จะถูกเพิ่มโดยเครื่องมือ (ไม่เหมาะสม) ที่คุณใช้
Dimitre Novatchev

6
ใช่ฉันคิดว่าปัญหา .. นั่นเป็นเพียงวิธี soapUI แสดงมัน แต่วงเล็บเหล่านั้นไม่ได้ใช้เมื่อฉันใช้ค่า xpath ฉันได้เห็นสิ่งนี้มากเวลา ปัญหาไม่ได้เกิดจากเครื่องมือ.. อยู่ระหว่างเก้าอี้กับคีย์บอร์ด
Abhishek Asthana

4
@KorayTugay นิพจน์ XPath /*/book[1]/title/@lang เลือกโหนดชุดของ 0 หรือมากกว่าแอตทริบิวต์โหนดในขณะที่นิพจน์ XPath string(/*/book[1]/title/@lang)เมื่อประเมินผลสร้างค่าสตริงของโหนดชุดนี้ - และนี่คือค่าสตริงของแรก (ตามลำดับเอกสาร) โหนดจากชุดโหนดนี้
Dimitre Novatchev

4
@KorayTugay, ไม่, นิพจน์แรกเลือก , ไม่ใช่ "return" - ชุดของโหนดและชุดของโหนดนี้ไม่ใช่สตริง โหนดไม่เป็นสตริง - โหนดเป็นโหนดในต้นไม้ เอกสาร XML เป็นแผนผังของโหนด lang="eng"เป็นเพียงหนึ่งในหลาย ๆ ข้อความของโหนดแอตทริบิวต์ที่มีชื่อ "lang" ไม่ได้อยู่ใน namespace และมีค่าสตริงสตริง "eng"
Dimitre Novatchev

1
@ วลาดิเมียร์, ถ้า v สอดคล้องกับ namespace-uri of say: "my: vvv", หนึ่งสามารถสร้างในโฮสต์ของเอ็นจิน XPath ที่ใช้การแม็พเชื่อมโยง myPrefix (อาจเป็น v แต่ไม่จำเป็น) กับเนมสเปซเดียวกัน -uri "my: vvv" จากนั้นจะเลือกแอตทริบิวต์โดยใช้: title / @ myPrefix: lang วิธีการสร้างการแมปดังกล่าวเป็นการใช้งานเฉพาะและมีการอ่านในเอกสารประกอบของโฮสต์ของเครื่องยนต์ XPath สิ่งนี้ทำในวิธีเฉพาะใน. NET และอีกวิธีหนึ่งในภาษาอังกฤษ หากคุณไม่มีการแมปใด ๆ ให้ใช้: title / @ * [name () = 'v: lang']
Dimitre Novatchev

47

ขอบคุณ! สิ่งนี้แก้ไขปัญหาที่คล้ายกันที่ฉันมีกับ data data ใน Div

<div id="prop_sample" data-want="data I want">data I do not want</div>

ใช้ xpath นี้: //*[@id="prop_sample"]/@data-want

หวังว่านี่จะช่วยคนอื่นได้!


6

คุณสามารถลองรูปแบบ xPath ด้านล่าง

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

5
ที่จะเลือกองค์ประกอบหัวเรื่อง XML ใด ๆภายใต้ / bookstore / book ที่มี lang Attribute พร้อมด้วยค่า eng ไม่ใช่ค่าของ lang นั่นคือจะเลือกรายการองค์ประกอบไม่ใช่แอตทริบิวต์เดียว
JFK

2

คุณสามารถรับมันได้ด้วย

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

แม้ว่าคุณจะใช้ XMLDOM กับ JavaScript คุณก็สามารถเขียนโค้ดบางอย่างได้

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

และn1.textจะให้คุณค่าแก่คุณ"eng"


2

คุณสามารถใช้ได้:

(//@lang)[1]

หมายความว่าคุณจะได้รับโหนดคุณลักษณะทั้งหมดที่มีชื่อเท่ากับ "lang" และรับโหนดแรก


0

นี่คือตัวอย่างของการรับค่าคุณลักษณะของ "lang" ด้วย XPath และ VTD-XML

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

0

หากคุณใช้ PostgreSQL นี่เป็นวิธีที่เหมาะสมในการรับ นี่เป็นเพียงข้อสันนิษฐานที่ที่คุณมีหนังสือตารางTITLEและราคาคอลัมน์ที่มีข้อมูลประชากร นี่คือแบบสอบถาม

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.