แอตทริบิวต์แท็ก XML แอตทริบิวต์ XML องค์ประกอบ XML องค์ประกอบ XML ที่ว่างเปล่าและไม่ว่างเปล่า

องค์ประกอบและคุณลักษณะใน XML Schema

นอกเหนือจากความเป็นไปได้มากมายในการกำหนดประเภทแล้ว ข้อมูลเอ็กซ์เอ็มแอลสคีมามีคำศัพท์มากมายสำหรับการกำหนดโครงสร้างเอกสาร ตลอดจนองค์ประกอบและคุณลักษณะที่อนุญาต

– เนื้อหาเรียบง่าย องค์ประกอบประกอบด้วยข้อความเท่านั้น (แม้ว่าตามที่กล่าวไว้ในย่อหน้าก่อนหน้า ข้อความสามารถจำกัดเฉพาะข้อมูลได้ แยกประเภทเช่นวันที่หรือ ค่าตัวเลข- เนื้อหาประเภทนี้ถูกกำหนดโดยใช้องค์ประกอบ simpleContent

- องค์ประกอบเท่านั้น องค์ประกอบประกอบด้วยองค์ประกอบที่ซ้อนกันเท่านั้น เนื้อหาของประเภทนี้ถูกกำหนดโดยใช้องค์ประกอบ complexType

– เนื้อหาผสม . องค์ประกอบสามารถมีทั้งเนื้อหาข้อความและองค์ประกอบที่ซ้อนกัน XML Schema กำหนดให้ลำดับขององค์ประกอบและเนื้อหาข้อความถูกกำหนดอย่างเคร่งครัด และเอกสารที่ถูกต้องจะต้องเป็นไปตามลำดับนั้น

– เนื้อหาว่างเปล่า . องค์ประกอบประกอบด้วยแอตทริบิวต์เท่านั้น และไม่มีเนื้อหาข้อความ XML Schema ตีความองค์ประกอบเช่น กรณีพิเศษเนื้อหาเฉพาะองค์ประกอบที่ไม่มีองค์ประกอบที่ประกาศ

– เนื้อหาใดๆ . องค์ประกอบสามารถเว้นว่างได้ มีองค์ประกอบที่ซ้อนกัน และ/หรือข้อความ เนื้อหาของประเภทนี้ถูกกำหนดโดยใช้องค์ประกอบ anyType

เหล่านี้ ประเภทพื้นฐานองค์ประกอบสามารถระบุได้ในการประกาศองค์ประกอบสคีมา คุณยังสามารถระบุได้ว่าองค์ประกอบอาจปรากฏหลายครั้งในเอกสาร และตั้งค่าขั้นต่ำและ ปริมาณสูงสุดเหตุการณ์ที่เกิดขึ้น เช่นเดียวกับ SQL XML Schema รองรับค่าองค์ประกอบ NULL ซึ่งบ่งชี้ว่าเนื้อหาขององค์ประกอบไม่เป็นที่รู้จัก ในคำศัพท์ XML ค่านี้เรียกว่าศูนย์ , แต่ความหมายก็เหมือนกัน การสนับสนุนค่านี้ช่วยให้ถ่ายโอนข้อมูลระหว่าง XML และคอลัมน์ฐานข้อมูลที่อาจมีค่า NULL ได้ง่ายขึ้น

XML สคีมาช่วยให้คุณสามารถกำหนดกลุ่มตรรกะขององค์ประกอบที่โดยทั่วไปจะใช้ร่วมกันและตั้งชื่อที่กำหนดเองให้กับกลุ่มนั้น กลุ่มนี้สามารถรวมไว้ในการประกาศองค์ประกอบที่ตามมาโดยรวมได้ การจัดกลุ่มองค์ประกอบทำให้โครงสร้างมีความยืดหยุ่นมากยิ่งขึ้น ทางกลุ่มสามารถกำหนดได้ ลำดับต่อมาองค์ประกอบที่ต้องมีอยู่ในเอกสารตามลำดับที่กำหนด หรืออาจกำหนดชุดขององค์ประกอบที่ต้องมีองค์ประกอบเดียวเท่านั้นในเอกสาร

ตัวเลือกที่คล้ายกันมีให้สำหรับการจัดการแอ็ตทริบิวต์ แอ็ตทริบิวต์แต่ละรายการสามารถกำหนดได้ตามต้องการหรือเป็นทางเลือก คุณสามารถตั้งค่าเริ่มต้นสำหรับแอตทริบิวต์ได้ ซึ่งจะถูกนำมาใช้หากไม่ได้ระบุค่าสำหรับแอตทริบิวต์นั้น คุณสามารถระบุค่าแอตทริบิวต์คงที่ ซึ่งเป็นค่าคงที่สำหรับแอตทริบิวต์นั้น คุณสามารถกำหนดชื่อของกลุ่มแอตทริบิวต์ที่ใช้ร่วมกันเสมอได้ หลังจากนั้น หากต้องการกำหนดกลุ่มของคุณลักษณะสำหรับองค์ประกอบถัดไปของสคีมา ก็เพียงพอที่จะระบุเฉพาะชื่อของกลุ่มนี้

ที่ทำงานเราถูกขอให้สร้างไฟล์ XML เพื่อถ่ายโอนข้อมูลไปยังไฟล์อื่น แอปพลิเคชันแบบสแตนด์อโลนซึ่งจะสร้างไฟล์ XML ไฟล์ที่สองเพื่อกลับมาอัปเดตข้อมูลบางส่วนของเรา ในระหว่างกระบวนการนี้ เราได้พูดคุยกับทีมงานของแอปพลิเคชันอื่น โครงสร้างเอ็กซ์เอ็มแอลไฟล์.

ตัวอย่างที่ฉันเจอโดยพื้นฐานแล้วจะมีลักษณะดังนี้:

อีกทีมหนึ่งระบุว่านี่ไม่ใช่มาตรฐานอุตสาหกรรม และควรใช้แอตทริบิวต์สำหรับข้อมูลเมตาเท่านั้น พวกเขาแนะนำ:

บางสิ่งบางอย่าง บางสิ่งบางอย่าง บางสิ่งบางอย่าง บางสิ่งบางอย่าง บางสิ่งบางอย่าง

เหตุผลที่ฉันคิดว่าอันแรกเป็นเพราะขนาด สร้างไฟล์น้อยกว่ามาก จะมีองค์ประกอบประมาณ 80,000 รายการที่จะอยู่ในไฟล์ ณ เวลาที่ถ่ายโอน ที่จริงแล้วข้อเสนอนี้มากกว่าที่ฉันเสนอถึงสามเท่า ฉันกำลังมองหา "มาตรฐานอุตสาหกรรม" อันลึกลับที่ถูกกล่าวถึง แต่สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือสิ่งนี้ แอตทริบิวต์ XMLซึ่งควรใช้สำหรับเมตาดาต้าเท่านั้น แต่บอกว่าการอภิปรายเกี่ยวกับสิ่งที่เป็นเมตาดาต้าจริงๆ

หลังจากอธิบายยาวๆ (ขออภัย) คุณจะกำหนดได้อย่างไรว่าข้อมูลเมตาคืออะไร และเมื่อออกแบบโครงสร้างของเอกสาร XML คุณควรตัดสินใจอย่างไรว่าเมื่อใดควรใช้แอตทริบิวต์หรือองค์ประกอบ

20 คำตอบ

ฉันใช้กฎนี้:

  • คุณลักษณะคือสิ่งที่สามารถพึ่งพาตนเองได้ เช่น สี, ID, ชื่อ.
  • องค์ประกอบคือสิ่งที่ทำหรือสามารถมีคุณสมบัติเป็นของตัวเองหรือมีองค์ประกอบอื่นๆ

ดังนั้นของคุณใกล้จะถึงแล้ว ฉันจะทำสิ่งที่ชอบ:

แก้ไข: อัพเดทแล้ว ตัวอย่างดั้งเดิมขึ้นอยู่กับ ข้อเสนอแนะด้านล่าง.

บางสิ่งบางอย่าง เอ็กซ์เอ็กซ์ ปปป

ปัญหาบางประการเกี่ยวกับคุณลักษณะ:

  • คุณลักษณะไม่สามารถมีหลายค่าได้ ( องค์ประกอบลูกสามารถ)
  • คุณลักษณะไม่เพียงขยายได้ (สำหรับการเปลี่ยนแปลงในอนาคต)
  • คุณลักษณะไม่สามารถอธิบายโครงสร้างได้ (องค์ประกอบย่อยสามารถ)
  • แอ็ตทริบิวต์นั้นยากกว่าที่จะจัดการด้วยค่าแอททริบิวต์ของโค้ด
  • ไม่ใช่เรื่องง่ายที่จะทดสอบกับ DTD

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

อย่าลงเอยแบบนี้ (นี่ไม่ใช่วิธีที่ควรใช้ XML):

"XML" ย่อมาจาก "ภาษามาร์กอัปที่ขยายได้" ภาษามาร์กอัปจะถือว่าข้อมูลเป็นข้อความ ซึ่งแท็กด้วยข้อมูลเมตาเกี่ยวกับโครงสร้างหรือการจัดรูปแบบ

XHTML เป็นตัวอย่างของ XML ที่ใช้ตามที่ตั้งใจไว้:

เอล เจเฟยืนยันว่าคุณ ต้องทำโครงการให้เสร็จภายในวันศุกร์

นี่คือจุดที่สร้างความแตกต่างระหว่างองค์ประกอบและคุณลักษณะ องค์ประกอบข้อความจะแสดงผลในเบราว์เซอร์ และแอตทริบิวต์เป็นคำแนะนำในการแสดงองค์ประกอบเหล่านั้น (แม้ว่าจะมีแท็กบางแท็กที่ใช้งานไม่ได้ในลักษณะนี้)

ความสับสนเกิดขึ้นเมื่อ XML ไม่ได้ถูกใช้เป็นภาษามาร์กอัป แต่เป็นภาษาซีเรียลไลซ์ข้อมูล ซึ่งความแตกต่างระหว่าง "data" และ "metadata" มีความคลุมเครือมากกว่า ดังนั้นการเลือกระหว่างองค์ประกอบและคุณลักษณะจึงขึ้นอยู่กับการตัดสินใจไม่มากก็น้อย ยกเว้นสิ่งที่ไม่สามารถแสดงด้วยคุณลักษณะได้ (ดูคำตอบของ fenster)

XML เป็นแบบแผน ขั้นแรก ให้แยกสคีมา XML ที่มีอยู่หรือแบบแผนที่กำหนดไว้ภายในชุมชนหรืออุตสาหกรรมของคุณ

หากคุณอยู่ในสถานการณ์ที่ต้องกำหนดวงจรตั้งแต่ต้น ต่อไปนี้คือข้อควรพิจารณาทั่วไปบางประการที่ควรแจ้งให้คุณทราบ องค์ประกอบเทียบกับ:

เนื้อหา ลำดับชั้น

  1. คำสั่ง
สามารถอ้างอิงถึงการนำกลับมาใช้ใหม่ได้ สำหรับมนุษย์ การใช้งานมากทำให้เอกสารบวม ชื่อที่ไม่ซ้ำหรือไม่ซ้ำกัน แยกวิเคราะห์ SAX: อ่านภายหลัง DTD: ไม่มีค่าเริ่มต้น

นี้อาจขึ้นอยู่กับการใช้งานของคุณ XML ที่ใช้เพื่อแสดงข้อมูลที่สร้างจากฐานข้อมูลสามารถทำงานได้ดีและจบลงด้วยการใส่ค่าฟิลด์เป็นแอตทริบิวต์

อย่างไรก็ตาม XML ที่ใช้เป็นการส่งข้อความมักจะใช้งานได้ดีกว่า มากกว่าองค์ประกอบ

ตัวอย่างเช่น สมมติว่าเรามี XML นี้ตามที่แนะนำในคำตอบ:-

เอ็กซ์เอ็กซ์ ปปป

ตอนนี้เราต้องการส่ง ITEM ไปยังอุปกรณ์การพิมพ์บาร์โค้ด อย่างไรก็ตาม มีตัวเลือกประเภทการเข้ารหัสให้เลือก เราจะแสดงประเภทการเข้ารหัสที่ต้องการได้อย่างไร โดยไม่คาดคิด เราตระหนักค่อนข้างล่าช้าว่าบาร์โค้ดไม่ใช่ค่าอัตโนมัติค่าเดียว แต่สามารถผ่านการรับรองด้วยการเข้ารหัสที่จำเป็นสำหรับการพิมพ์

บางสิ่งบางอย่าง เอ็กซ์เอ็กซ์ ปปป

ประเด็นก็คือ เว้นแต่ว่าคุณกำลังสร้าง XSD หรือ DTD บางอย่างพร้อมกับเนมสเปซเพื่อแก้ไขโครงสร้างแบบหิน วิธีที่ดีที่สุดคือเปิดตัวเลือกไว้

IMO XML มีประโยชน์มากที่สุดเมื่อสามารถโค้งงอได้โดยไม่ทำลายโค้ดที่มีอยู่

คุณสมบัติที่ต้องการมีดังนี้:

  • ไม่ซ้ำกัน (แอตทริบิวต์ไม่สามารถปรากฏหลายครั้ง)
  • คำสั่งซื้อไม่สำคัญ
  • คุณสมบัติข้างต้นได้รับการสืบทอดมา (นี่คือสิ่งที่โมเดลเนื้อหา "ทั้งหมด" ไม่รองรับในภาษาสคีมาปัจจุบัน)
  • โบนัส - มีรายละเอียดน้อยกว่าและใช้แบนด์วิดท์น้อยกว่า แต่นี่ไม่ใช่เหตุผลที่จะสนับสนุนคุณลักษณะมากกว่าองค์ประกอบ

ฉันเพิ่มเมื่อเป็นไปได้ในทางเทคนิคเนื่องจากมีบางครั้งที่ไม่สามารถใช้แอตทริบิวต์ได้ เช่น การเลือกชุดแอตทริบิวต์ ตัวอย่างเช่น การใช้ (startDate และ endDate) xor (startTS และ endTS) ไม่สามารถทำได้กับภาษาสคีมาปัจจุบัน

หาก XML Schema เริ่มอนุญาตโมเดลเนื้อหา "ทั้งหมด" ที่จำกัดหรือขยาย ฉันอาจจะรีเซ็ตมัน

ไม่มีคำตอบที่เป็นสากลสำหรับคำถามนี้ (ฉันมีส่วนร่วมอย่างแข็งขันในการสร้างข้อกำหนด W3C) XML สามารถใช้เพื่อวัตถุประสงค์หลายประการ - เอกสารข้อความ ข้อมูล และโค้ดประกาศคือสามสิ่งที่พบบ่อยที่สุด ฉันยังใช้มันเป็นแบบจำลองข้อมูล มีแง่มุมต่างๆ ของแอปพลิเคชันเหล่านี้ที่แอตทริบิวต์มีความเหมือนกันมากกว่า และคุณสมบัติอื่นๆ ที่องค์ประกอบลูกมีความเป็นธรรมชาติมากกว่า นอกจากนี้ยังมีคุณสมบัติของเครื่องมือต่าง ๆ ที่ทำให้ใช้งานได้ง่ายขึ้นหรือง่ายขึ้น

XHTML เป็นพื้นที่หนึ่งที่คุณลักษณะมีการใช้งานตามธรรมชาติ (เช่น ใน class="foo") คุณลักษณะไม่เป็นระเบียบ และอาจทำให้การพัฒนาเครื่องมือง่ายขึ้นสำหรับบางคน แอตทริบิวต์ OTOH จะป้อนได้ยากกว่าหากไม่มีสคีมา ฉันยังพบว่าแอตทริบิวต์ที่มีชื่อ (foo:bar="zork") มักจะยากกว่าในการจัดการกับชุดเครื่องมือต่างๆ แต่ลองดูภาษา W3C บ้างเพื่อดูว่ามีการผสมผสานกันทั่วไป SVG, XSLT, XSD, MathML คือตัวอย่างบางส่วนของภาษาที่รู้จักกันดี และภาษาเหล่านี้ล้วนมีคุณสมบัติและองค์ประกอบมากมาย บางภาษาอนุญาตให้มีมากกว่าหนึ่งวิธีเช่น

;

บาร์; ;

โปรดทราบว่าสิ่งเหล่านี้ไม่เทียบเท่าทางวากยสัมพันธ์และต้องการการสนับสนุนที่ชัดเจนในเครื่องมือประมวลผล)

คำแนะนำของฉันคือการดูแนวทางปฏิบัติทั่วไปในพื้นที่ของคุณและพิจารณาว่าคุณสามารถใช้เครื่องมือใดได้บ้าง

สุดท้าย ตรวจสอบให้แน่ใจว่าคุณแยกแยะเนมสเปซจากแอตทริบิวต์ ระบบ XML บางระบบ (เช่น Linq) เปิดเผยเนมสเปซเป็นแอตทริบิวต์ API IMO มันน่าเกลียดและอาจสร้างความสับสน

หลายๆ คนได้พิจารณาถึงวิธีแยกแยะคุณลักษณะจากองค์ประกอบต่างๆ แต่จากมุมมองทั่วไปแล้ว ให้ใส่ทุกอย่างลงในแอตทริบิวต์เพราะจะทำให้ XML ที่ได้ผลลัพธ์มีแนวโน้มที่จะเกิดข้อผิดพลาดน้อยลง

XML ไม่ได้ออกแบบมาให้มีขนาดกะทัดรัด แต่ให้พกพาได้และมนุษย์สามารถอ่านได้ หากคุณต้องการลดขนาดของข้อมูลที่อยู่ระหว่างการส่ง ให้ใช้อย่างอื่น (เช่น บัฟเฟอร์โปรโตคอลของ Google)

อาจเป็นที่ถกเถียงกันไม่ทางใดก็ทางหนึ่ง แต่เพื่อนร่วมงานของคุณพูดถูกในแง่ที่ว่าควรใช้ XML เพื่อ "ตัด" หรือข้อมูลเมตารอบข้อมูลจริง ในส่วนของคุณ คุณพูดถูกที่บางครั้งอาจเป็นเรื่องยากที่จะตัดสินใจว่าเส้นแบ่งระหว่างข้อมูลเมตาและข้อมูลเมื่อสร้างแบบจำลองโดเมนของคุณใน XML นั้นเป็นเรื่องยาก ในทางปฏิบัติ ฉันแกล้งทำเป็นว่ามีบางอย่างในมาร์กอัปถูกซ่อนอยู่ และอ่านเฉพาะข้อมูลภายนอกมาร์กอัปเท่านั้น เอกสารนี้สมเหตุสมผลหรือไม่?

XML นั้นเทอะทะอย่างฉาวโฉ่ สำหรับการขนส่งและการจัดเก็บ แนะนำให้ใช้การบีบอัดหากคุณมีกำลังการประมวลผลเพียงพอ XML บีบอัดได้ดี และบางครั้งก็ดีอย่างน่าอัศจรรย์ เนื่องจากสามารถทำซ้ำได้ ฉันมีไฟล์ขนาดใหญ่ที่ถูกบีบอัดให้เหลือน้อยกว่า 5% ของขนาดดั้งเดิม

อีกประเด็นหนึ่งที่จะช่วยเสริมประเด็นของคุณก็คือในขณะที่อีกทีมกำลังโต้เถียงกันเกี่ยวกับสไตล์ (ในเครื่องมือ XML ส่วนใหญ่จะปฏิบัติต่อเอกสารที่มีแอตทริบิวต์ทั้งหมดเช่นเดียวกับเอกสาร PCDATA ทั้งหมด #) คุณยืนยันการใช้งานได้จริง แม้ว่าสไตล์จะไม่สามารถละเลยไปได้โดยสิ้นเชิง แต่ข้อดีทางเทคนิคก็ต้องมีน้ำหนักมากกว่า

ใช้องค์ประกอบสำหรับข้อมูลและแอตทริบิวต์สำหรับข้อมูลเมตา (ข้อมูลเกี่ยวกับข้อมูลขององค์ประกอบ)

หากองค์ประกอบปรากฏเป็นเพรดิเคตในบรรทัดที่คุณเลือก แสดงว่าคุณมีสัญญาณที่ดีว่าควรเป็นแอตทริบิวต์ ในทำนองเดียวกัน หากไม่เคยใช้แอตทริบิวต์เป็นเพรดิเคต ก็อาจไม่เป็นประโยชน์เมตาดาต้า

โปรดจำไว้ว่า XML ควรเป็นแบบที่เครื่องอ่านได้ ไม่ใช่แบบที่มนุษย์อ่านได้ และสำหรับเอกสารขนาดใหญ่ XML จะบีบอัดได้ดีมาก

แล้วใช้สัญชาตญาณของเราเพื่อหาเงินเดือนที่มั่นคงล่ะ? โดยทั่วไปแล้ว ฉันคิดว่ามันตรงไปตรงมาที่จะคิดว่าวัตถุคืออะไร และคุณลักษณะของวัตถุหรือวัตถุที่วัตถุนั้นอ้างถึงคืออะไร

ไม่ว่ามันจะสมเหตุสมผลแค่ไหนก็ตาม เนื่องจากวัตถุจะต้องพอดีกับองค์ประกอบต่างๆ คุณลักษณะ (หรือคุณสมบัติ) ของมันจะเป็นคุณลักษณะสำหรับองค์ประกอบเหล่านั้นใน xml หรือองค์ประกอบลูกที่มีแอตทริบิวต์

ฉันคิดว่าสำหรับกรณีที่ง่ายกว่าเช่นตัวอย่าง การเปรียบเทียบการวางแนววัตถุทำงานได้ดีในการพิจารณาว่าองค์ประกอบคืออะไรและคุณลักษณะใดขององค์ประกอบนั้น

คำถามล้านดอลลาร์!

ไม่ต้องกังวลกับประสิทธิภาพในตอนแรก คุณจะแปลกใจว่าโปรแกรมแยกวิเคราะห์ xml ที่ได้รับการปรับปรุงจะคัดลอกไฟล์ xml ของคุณได้เร็วแค่ไหน ที่สำคัญกว่านั้นคือการออกแบบของคุณสำหรับอนาคต: เมื่อ XML พัฒนาขึ้น คุณจะรักษาการเชื่อมต่อที่หลวมและการทำงานร่วมกันได้อย่างไร

โดยเฉพาะอย่างยิ่ง คุณสามารถทำให้โมเดลเนื้อหาขององค์ประกอบซับซ้อนมากขึ้นได้ แต่จะขยายแอตทริบิวต์ได้ยากกว่า

ส่วนใหญ่มันเป็นเรื่องของการตั้งค่า ฉันใช้องค์ประกอบสำหรับการจัดกลุ่มและแอตทริบิวต์สำหรับข้อมูลหากเป็นไปได้ เนื่องจากฉันพบว่ามีขนาดกะทัดรัดกว่าทางเลือกอื่น

เช่น ผมขอ.....

แทนที่จะเป็น....

โรรี่ เบกเกอร์ 30 ทราวิส อิลลิก 32 สกอตต์ ฮันเซลแมน 34

อย่างไรก็ตาม หากฉันมีข้อมูลที่ไม่สามารถแสดงภายในได้อย่างง่ายดาย เช่น อักขระ 20-30 ตัว หรือมีเครื่องหมายคำพูดจำนวนมาก หรือมีอักขระอื่นๆ ที่ต้องหลีกเลี่ยง ฉันว่าถึงเวลาต้องแยกองค์ประกอบออก... บางที ด้วยบล็อก CData

โปรแกรมเมอร์ผู้สนใจงานเบ็ดเตล็ดทุกประเภท บล็อกของเขาสามารถพบได้ที่ http://rorybecker.blogspot.com และเขาบน Twitter ในชื่อ @RoryBecker ผู้ชายเจ๋งๆ ที่ช่วยฉันในเรื่องข้อมูล SVn ทุกประเภท Scott ทำงานให้กับ MS และมีพอดแคสต์ดีๆ อยู่ที่ http://www.hansel minutes.com

องค์ประกอบ XML สามารถมีแอตทริบิวต์ได้ เช่นเดียวกับ HTML

คุณลักษณะได้รับการออกแบบให้มีข้อมูลเฉพาะสำหรับองค์ประกอบเฉพาะ

แอตทริบิวต์ XML จะต้องอยู่ในเครื่องหมายคำพูด

ค่าแอตทริบิวต์จะต้องอยู่ในเครื่องหมายคำพูดเสมอ ไม่ว่าจะโสดหรือ เครื่องหมายคำพูดคู่สามารถใช้

สำหรับเพศของบุคคลนั้น องค์ประกอบสามารถเขียนได้ดังนี้:

หรือเช่นนี้:

หากค่าแอตทริบิวต์มีเครื่องหมายคำพูดคู่ คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวได้ ดังในตัวอย่างนี้:

หรือคุณสามารถใช้เอนทิตีตัวละคร:

องค์ประกอบ XML เทียบกับแอตทริบิวต์

ดูตัวอย่างเหล่านี้:

แอนนา
สมิธ


หญิง
แอนนา
สมิธ

ในตัวอย่างแรก เพศเป็นคุณลักษณะ ประการหลังเรื่องเพศเป็นองค์ประกอบ ทั้งสองตัวอย่างให้ข้อมูลเดียวกัน

ไม่มีกฎเกณฑ์ว่าเมื่อใดควรใช้แอตทริบิวต์หรือเมื่อใดควรใช้องค์ประกอบใน XML

วิธีที่ฉันชอบ

เอกสาร XML สามรายการต่อไปนี้มีข้อมูลที่เหมือนกันทุกประการ:

แอตทริบิวต์ date ถูกใช้ในตัวอย่างนี้:


โทเว่
เจนี่

องค์ประกอบถูกใช้ในตัวอย่างที่ 2:


2008-01-10
โทเว่
เจนี่

ขยายแล้ว องค์ประกอบถูกใช้ในตัวอย่างที่สาม: (นี่คือรายการโปรดของฉัน) :



2008
01
10

โทเว่
เจนี่

หลีกเลี่ยงแอตทริบิวต์ XML หรือไม่

สิ่งที่ต้องพิจารณาเมื่อใช้แอตทริบิวต์:

  • คุณลักษณะไม่สามารถมีหลายค่าได้ (องค์ประกอบสามารถ)
  • คุณลักษณะไม่สามารถมีโครงสร้างต้นไม้ (องค์ประกอบสามารถ)
  • คุณลักษณะไม่สามารถขยายได้ง่าย (สำหรับการเปลี่ยนแปลงในอนาคต)

อย่าจบแบบนี้:

ถึง = "Tove" จาก = "Jani" heading = "เตือนความจำ"
body="อย่าลืมฉันสุดสัปดาห์นี้!">

แอตทริบิวต์ XML สำหรับข้อมูลเมตา



โทเว่
เจนี่
คำเตือน
สุดสัปดาห์นี้อย่าลืมฉัน!




เจนี่
โทเว่
Re: คำเตือน
ฉันจะไม่



แอตทริบิวต์ id ด้านบนเพื่อระบุบันทึกย่อต่างๆ มันไม่ได้เป็นส่วนหนึ่งของบันทึกย่อนั้นเอง

สิ่งที่ฉันพยายามจะพูดที่นี่คือข้อมูลเมตา (ข้อมูลเกี่ยวกับข้อมูล) ควรถูกจัดเก็บเป็นแอตทริบิวต์และข้อมูลควรถูกจัดเก็บเป็นองค์ประกอบ

เช่นเดียวกับใน HTML องค์ประกอบ XMLอาจมีคุณสมบัติ ในกรณีนี้คือค่า คุณลักษณะใน XMLและกฎเกณฑ์สำหรับการสร้างพวกมันก็มีหลายวิธีคล้ายคลึงกับ

คุณสมบัติที่มีให้ ข้อมูลเพิ่มเติมเกี่ยวกับองค์ประกอบ

แอตทริบิวต์ XML

ใน แอตทริบิวต์ HTMLให้ข้อมูลเพิ่มเติมเกี่ยวกับองค์ประกอบ:

แอตทริบิวต์มักให้ข้อมูลที่ไม่ได้เป็นส่วนหนึ่งของข้อมูล ในตัวอย่างด้านล่าง ประเภทไฟล์ไม่ขึ้นอยู่กับข้อมูล แต่ข้อมูลนี้อาจมีความสำคัญต่อแอปพลิเคชันที่จะจัดการองค์ประกอบนี้:

คอมพิวเตอร์.gif

แอตทริบิวต์ XML จะต้องอยู่ในเครื่องหมายคำพูด

ค่าแอตทริบิวต์จะต้องอยู่ในเครื่องหมายคำพูดเสมอ สิ่งเหล่านี้สามารถเป็นได้ทั้งสองครั้งหรือ คำพูดเดียว ตัวอย่างเช่น เพศของตัวละครสามารถเขียนได้ดังนี้:

หรือเช่นนี้:

หากค่าแอตทริบิวต์มีเครื่องหมายคำพูดคู่ ก็สามารถใช้เครื่องหมายคำพูดเดี่ยวได้ ตัวอย่างเช่น:

หรือใช้สัญลักษณ์เอนทิตี:

องค์ประกอบหรือแอตทริบิวต์ XML

ดูตัวอย่างต่อไปนี้:

ตัวอย่างหมายเลข 1

แอนนา สมิธ

ตัวอย่างหมายเลข 2

หญิง แอนนา สมิธ

ในตัวอย่างแรก มีการระบุเพศในแอตทริบิวต์ ประการที่สอง เพศจะถูกบันทึกเป็นองค์ประกอบ ทั้งสองตัวอย่างให้ข้อมูลที่เหมือนกัน

ไม่มีกฎเกณฑ์ที่ควบคุมว่าเมื่อใดควรใช้แอตทริบิวต์และเมื่อใดควรใช้องค์ประกอบ คุณลักษณะที่ใช้กันอย่างแพร่หลายใน HTML ในความคิดของฉันใน XML ควรหลีกเลี่ยงและใช้องค์ประกอบแทนจะดีกว่า

อันไหนดีกว่ากัน?

สามต่อไป เอกสารเอ็กซ์เอ็มแอลมีข้อมูลเหมือนกันทุกประการ:

วันที่จะถูกบันทึกเป็นคุณลักษณะ:

โทเว่ เจนี่ คำเตือน

วันที่เขียนเป็นองค์ประกอบ:

10/01/2008 โทเว่ เจนี่ คำเตือน สุดสัปดาห์นี้อย่าลืมฉันนะ!

วันที่ถูกเขียนเป็นองค์ประกอบเพิ่มเติม(ในความเห็นของฉัน ตัวเลือกที่ดีที่สุด):

10 01 2008 โทเว่ เจนี่ คำเตือน สุดสัปดาห์นี้อย่าลืมฉันนะ!

หลีกเลี่ยงแอตทริบิวต์ XML หรือไม่

มีปัญหาบางประการเมื่อใช้แอตทริบิวต์:

  • คุณลักษณะไม่สามารถมีหลายค่าได้ (องค์ประกอบสามารถ)
  • คุณลักษณะไม่สามารถมีโครงสร้างต้นไม้ (องค์ประกอบสามารถ)
  • คุณลักษณะนั้นขยายได้ยาก (สำหรับการเปลี่ยนแปลงในอนาคต)

ห้ามใช้โครงสร้างต่อไปนี้:

แอตทริบิวต์ XML สำหรับข้อมูลเมตา

บางครั้งองค์ประกอบได้รับการกำหนดตัวระบุ ตัวระบุเหล่านี้ใช้เพื่อระบุองค์ประกอบ XML ในลักษณะเดียวกับแอตทริบิวต์การระบุใน HTML ทุกประการ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงสิ่งนี้:

โทเว่ เจนี่ คำเตือน สุดสัปดาห์นี้อย่าลืมฉันนะ!

เจนี่ โทเว่ Re: คำเตือน ฉันจะไม่ลืม

ในตัวอย่างข้างต้น แอตทริบิวต์ id ใช้เพื่อระบุบันทึกย่อต่างๆ ข้อมูลนี้ไม่ได้เป็นส่วนหนึ่งของบันทึกย่อ

แนวคิดหลักของทั้งหมดที่กล่าวมาก็คือข้อมูลเมตา (ข้อมูลเกี่ยวกับข้อมูล) ควรเขียนเป็นแอตทริบิวต์และข้อมูลเองก็เป็นองค์ประกอบ

เรานำเสนอเพื่อความสนใจของคุณ หลักสูตรใหม่จากทีม โค๊ดบี้- "การทดสอบการเจาะระบบของแอปพลิเคชันเว็บตั้งแต่เริ่มต้น" ทฤษฎีทั่วไป, การเตรียมสภาพแวดล้อมการทำงาน, การคลุมเครือแบบพาสซีฟและการพิมพ์ลายนิ้วมือ, การคลุมเครือแบบแอคทีฟ, ช่องโหว่, หลังการแสวงหาผลประโยชน์, เครื่องมือ, วิศวกรรมสังคม และอื่นๆ อีกมากมาย


คุณสมบัติไฟล์ XML

ในบทความที่แล้ว คุณได้เรียนรู้วิธีทำงานกับองค์ประกอบและโหนดของไฟล์ XML ในบทความนี้ คุณจะได้เรียนรู้ว่าแอตทริบิวต์คืออะไร และเราจะวิเคราะห์การดำเนินการพื้นฐานด้วย เช่น การสร้าง การเปลี่ยนแปลง การลบ และเพิ่มแอตทริบิวต์โดยใช้ภาษา ค#

ตามที่กล่าวไว้ก่อนหน้าในบทความก่อนหน้านี้ องค์ประกอบไฟล์ XML สามารถมีแอตทริบิวต์ที่ไม่ซ้ำกันจำนวนเท่าใดก็ได้ซึ่งคุณสามารถจัดเก็บได้ ข้อมูลต่างๆ- นั่นคือองค์ประกอบหนึ่งไม่สามารถมีแอตทริบิวต์ "id" สองรายการได้ แต่สามารถมีแอตทริบิวต์ได้หลายรายการพร้อมกัน: "id", "name", "code" เป็นต้น มันก็ควรค่าแก่การจดจำเช่นกัน คุณลักษณะ ไฟล์ xml อยู่ในเครื่องหมายคำพูดคู่

องค์ประกอบรถยนต์มีแอตทริบิวต์รหัส 1 รายการซึ่งมีค่าเป็น 1

องค์ประกอบรถยนต์มีแอตทริบิวต์ 2 รายการ ได้แก่ รหัสและรหัส

ไม่ถูกต้อง มีการใช้แอตทริบิวต์ที่ซ้ำกัน

ถ้าคุณไม่คุ้นเคย ภาษาเอ็กซ์เอ็มแอลหรือไม่รู้ว่ามันคืออะไร xml โดมฉันแนะนำให้คุณอ่านบทความ: .

เรามาฝึกกันต่อ

ขั้นแรกคุณต้องสร้างอันว่างที่มีองค์ประกอบรูทหนึ่งรายการ .

ผลลัพธ์ควรมีลักษณะเช่นนี้

ทีนี้ลองมาพิจารณากัน การดำเนินงานขั้นพื้นฐานด้วยคุณสมบัติ

วิธีสร้างแอตทริบิวต์ไฟล์ XML

เพื่อที่จะสร้าง คุณลักษณะใหม่คุณสามารถใช้เมธอด SetAttribute ของคลาส System.Xml.XmlElement ซึ่งช่วยให้คุณสามารถสร้างและเปลี่ยนแปลงแอตทริบิวต์ขององค์ประกอบได้

ในตัวอย่างแรก เราจะสร้างองค์ประกอบ "โรงรถ" ด้วยแอตทริบิวต์ "id" ซึ่งเราจะกำหนดค่าเป็น 3

โปรแกรมคลาส ( fileName สตริงคงที่ = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); XmlElement elmGarage = xmlDoc.CreateElement(" โรงรถ"); elmGarage.SetAttribute("id", "3"); xmlDoc.DocumentElement.AppendChild(elmGarage); xmlDoc.Save(ชื่อไฟล์); ) )

ผลลัพธ์

วิธีสร้างแอตทริบิวต์หลายรายการ

หากคุณต้องการสร้างแอตทริบิวต์มากกว่าหนึ่งรายการสำหรับองค์ประกอบเดียว ในตัวอย่างก่อนหน้านี้ เราเพียงแค่เพิ่มบรรทัดต่อไปนี้

ElmGarage.SetAttribute("id", "3"); elmGarage.SetAttribute("นับ", "1"); //เพิ่ม elmGarage.SetAttribute("shortCode", "456"); //เพิ่ม

ตอนนี้จะมีการสร้างแอตทริบิวต์ 3 รายการ: "id", "count", "shortCode" และ 3 ค่า: 3, 1, 456

อีกวิธีหนึ่ง

เพราะ คุณสมบัติ xmlองค์ประกอบต่างๆ มีชื่อและค่า ดังนั้น SortedList จึงเหมาะอย่างยิ่งสำหรับการจัดเก็บข้อมูลดังกล่าว โดยที่ T คือชื่อแอตทริบิวต์ K คือค่า

โปรแกรมคลาส ( fileName สตริงคงที่ = @"C:\atr\1.xml"; SortedList แบบคงที่ รายการเรียงลำดับ; sortlist = รายการเรียงลำดับใหม่ - โมฆะคงที่หลัก (args สตริง) ( // กรอกแอตทริบิวต์และค่า sortlist.Add ("id", "3"); sortlist.Add ("count", "1"); sortlist.Add ("shortCode" , "456 "); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(ชื่อไฟล์); องค์ประกอบใหม่โรงรถ XmlElement elmGarage = xmlDoc.CreateElement("โรงรถ"); //เพิ่มแอตทริบิวต์และค่าให้กับมัน foreach (รายการ var ใน sortlist) ( elmGarage.SetAttribute(item.Key, item.Value); ) //เพิ่มองค์ประกอบใหม่ของเราลงในแผนผัง xmlDoc.DocumentElement.AppendChild(elmGarage); //หากต้องการตรวจสอบ ให้แสดงจำนวนแอตทริบิวต์ที่สร้างขึ้น Console.WriteLine("จำนวนแอตทริบิวต์ที่เพิ่ม: (0)", elmGarage.Attributes.Count); //บันทึก xmlDoc.Save(ชื่อไฟล์); -

ผลลัพธ์

วิธีการเปลี่ยนค่าของแอตทริบิวต์ไฟล์ XML

หากต้องการเปลี่ยนค่าของแอตทริบิวต์ขององค์ประกอบ คุณสามารถใช้เมธอด SetAttribute ที่เราใช้ก่อนหน้านี้เพื่อสร้างแอตทริบิวต์ได้

โปรแกรมคลาส ( fileName สตริงคงที่ = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //If ของคุณลักษณะนี้ไม่มี id จากนั้นจะถูกสร้างขึ้น xmlDoc.DocumentElement["garage"].SetAttribute("id", "5"); xmlDoc.Save(ชื่อไฟล์); -

อีกวิธีหนึ่งในการทำงานกับแอ็ตทริบิวต์คือการทำงานกับคลาส ในตัวอย่างของเรา อันดับแรกเราได้รับแอตทริบิวต์ทั้งหมดขององค์ประกอบโรงรถ จากนั้นใช้เมธอด GetNamedItem ซึ่งจะค้นหาแอตทริบิวต์ที่เราต้องการ จากนั้นใช้คุณสมบัติ InnerText เราจะเปลี่ยนค่าแอตทริบิวต์

โปรแกรมคลาส ( สตริงคงที่ fileName = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //รับคุณลักษณะทั้งหมดของโรงรถ องค์ประกอบ XmlAttributeCollection atrCol; atrCol = xmlDoc.DocumentElement["garage"].Attributes; // เปลี่ยนค่าของแอตทริบิวต์ id atrCol.GetNamedItem("id").InnerText = "5";

ผลลัพธ์

ตัวอย่างต่อไปนี้แสดงวิธีที่คุณสามารถกำหนดค่าเดียวกันให้กับแอตทริบิวต์ทั้งหมดขององค์ประกอบเดียวได้ ขั้นแรก เรายังได้รับแอตทริบิวต์ทั้งหมด จากนั้นใช้เมธอด Item(i) ที่คุณสามารถเลื่อนผ่านแอตทริบิวต์โดยใช้ดัชนี เช่นเดียวกับในอาร์เรย์ปกติ

โปรแกรมคลาส ( fileName สตริงคงที่ = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); XmlAttributeCollection atrCol = xmlDoc. DocumentElement[" โรงรถ"] คุณสมบัติ สำหรับ (int i = 0; i< atrCol.Count; i++) { atrCol.Item(i).InnerText = "8"; } xmlDoc.Save(fileName); } }

ผลลัพธ์

หากคุณต้องการกำหนดคุณลักษณะแต่ละรายการ ความหมายที่แตกต่างกันจากนั้นคุณก็ทำสิ่งนี้ได้

ตามตัวอย่าง เรามาสร้างอาร์เรย์โดยปล่อยให้มีตัวเลขสองตัว โดยแต่ละตัวเลขจะเป็นค่าใหม่สำหรับแอตทริบิวต์: “id” และ “count” ขององค์ประกอบ “garage”

โปรแกรมคลาส ( สตริงคงที่ fileName = @"C:\atr\1.xml"; static int arValues ​​​​= (77, 76); static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load (ชื่อไฟล์ ); XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].แอตทริบิวต์;< atrCol.Count; i++) { atrCol.Item(i).InnerText = arValues[i].ToString(); } xmlDoc.Save(fileName); } }

ผลลัพธ์

วิธีลบแอตทริบิวต์องค์ประกอบในไฟล์ XML

เราเรียนรู้วิธีสร้างและเปลี่ยนแปลงคุณสมบัติ หากคุณไม่เข้าใจโค้ดบางบรรทัด คุณสามารถอ่านบทความได้ ซึ่งมีการอธิบายรายละเอียดทุกอย่างไว้

ถึง ลบแอตทริบิวต์คุณต้องดำเนินการเมธอด RemoveAt โดยส่งดัชนีของแอตทริบิวต์ที่จะลบออกเป็นพารามิเตอร์

โปรแกรมคลาส ( สตริงคงที่ fileName = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //รับคุณลักษณะทั้งหมดของโรงรถ องค์ประกอบ XmlAttributeCollection atrCol = xmlDoc. DocumentElement ["garage"] คุณสมบัติ; atrCol.RemoveAt (1);

ผลลัพธ์

วิธีลบแอตทริบิวต์หลายรายการ

หากคุณต้องการลบทั้งแอตทริบิวต์ "id" และ "count" ในคราวเดียวหรือมากกว่านั้น วิธีการ RemoveAll ก็เหมาะสำหรับในกรณีนี้

โปรแกรมคลาส ( สตริงคงที่ fileName = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //รับคุณลักษณะทั้งหมดของโรงรถ องค์ประกอบ XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; //remove ทั้ง id และ count คุณลักษณะ atrCol.RemoveAll();

ผลลัพธ์

การเพิ่มคุณสมบัติใหม่

ในตอนท้ายมีอีกตัวอย่างหนึ่งที่แสดงการทำงานของสองวิธี: InsertBefore และ InsertAfter ซึ่งอนุญาต เพิ่มคุณลักษณะใหม่องค์ประกอบของไฟล์ XML ก่อนหรือหลังแอตทริบิวต์ที่มีอยู่

โปรแกรมคลาส ( สตริงคงที่ strFilename = @"C:\atr\1.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); // รับคุณลักษณะทั้งหมดของโรงรถ องค์ประกอบ XmlAttributeCollection atrCol = xmlDoc. DocumentElement["garage"].Attributes; //สร้างแอตทริบิวต์ใหม่ XmlAttribute atrDate = xmlDoc.CreateAttribute("date"); atrDate.Value = DateTime.Now.ToShortDateString(); ; //ลบความคิดเห็นที่อยู่ถัดจากวิธีการที่ต้องการ //ใส่แอตทริบิวต์ date หลังแอตทริบิวต์ id //atrCol.InsertBefore(atrCol["id"], atrDate); //ใส่แอตทริบิวต์ date ก่อนแอตทริบิวต์ id // atrCol.InsertAfter(atrCol["id"], atrDate); xmlDoc.Save(strFilename) )

ผลลัพธ์

เพิ่มไปยังคอลเลกชัน

วิธีรับค่าของแอตทริบิวต์ไฟล์ xml สำหรับหลายโหนด

กำหนดไฟล์ xml ที่มีสองโหนดชื่อ car ซึ่งแต่ละโหนดจะมีแอตทริบิวต์ id หนึ่งรายการ

ภารกิจ: รับค่าของแอตทริบิวต์ id ของโหนดรถยนต์ทั้งหมด

โปรแกรมคลาส ( สตริงคงที่ fileName = @" C:\example\garage.xml"; static void Main(string args) ( XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); //รับโหนดทั้งหมดที่มี ชื่อรถ XmlNodeList nodeList= xmlDoc.GetElementsByTagName("car"); // ส่งออกค่าของแอตทริบิวต์ id ของโหนดที่พบทั้งหมด car foreach (XmlNode xmlnode ใน nodeList) ( Console.WriteLine(xmlnode.Attributes["id"] .InnerText); ) คอนโซล .ReadLine(); // ไม่จำเป็นต้องบันทึก)

ผลลัพธ์:

วิธีเปลี่ยนค่าของแอตทริบิวต์ไฟล์ xml สำหรับหลายโหนด

ภารกิจ: เพิ่มค่าปัจจุบันของแอตทริบิวต์ id สำหรับแต่ละโหนดด้วยค่าที่แน่นอน

โปรแกรมคลาส ( สตริงคงที่ fileName = @"C:\example\garage.xml"; static void Main(string args) ( //ค่าที่เราจะเพิ่มค่าปัจจุบันของแอตทริบิวต์ int changeValue = 900; //temporary ตัวแปรเพื่อเก็บค่าใหม่ int newValue = 0; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(fileName); // รับโหนดทั้งหมดด้วยชื่อ car XmlNodeList nodeList= xmlDoc.GetElementsByTagName("car"); /รับค่าปัจจุบันของแอตทริบิวต์ id //และเพิ่ม เช่น 900 newValue = int.Parse(xmlnode.Attributes["id"].InnerText) + changeValue; //Add a new value xmlnode.Attributes .InnerText = newValue.ToString(); ) //บันทึกการเปลี่ยนแปลง xmlDoc.Save(fileName);

* สำหรับคอลเลกชันแอตทริบิวต์ ในวงเล็บคุณสามารถระบุทั้งชื่อแอตทริบิวต์แอตทริบิวต์ ["id"] และแอตทริบิวต์ดัชนี