Вступление
Здравствуйте, дорогие читатели моей статьи. Это уже вторая статья из цикла про XML, и в данной статье будет рассказывать про XML Namespace и XML Schema.XML Namespace
Namespace значит «пространство имён», однако в этой статье я буду часто подменивать русское выражение на просто namespace, ибо это короче и комфортнее для понимания. XML Namespace – это технология, основная цель которой - сделать так, чтобы все элементы были уникальными в XML файле и не было путаницы. И так, How это Java курсы, то такая же технология есть и в Java – пакеты. Если бы можно было поместить два класса с одинаковым именем рядом и использовать их, то How мы бы определor, Howой класс нам нужен? Эта проблема решена пакетами – мы можем просто разместить классы в разные пакеты и импортировать их оттуда, точно указав Name нужного пакета и way to нему, or просто указав полный way to нужному классу.![Java бағдарламашысына арналған XML негіздері. 3-тен 2-бөлім - 1](https://cdn.javarush.com/images/article/20ee6624-9d43-4f7c-8f4e-faed722986de/original.jpeg)
public class ExampleInvocation {
public static void main(String[] args) {
// Creation экземпляра класса из первого пакета.
example_package_1.Example example1 = new example_package_1.Example();
// Creation экземпляра класса из второго пакета.
example_package_2.Example example2 = new example_package_2.Example();
// Creation экземпляра класса из третьего пакета.
example_package_3.Example example3 = new example_package_3.Example();
}
}
В XML Namespace все примерно так же, только немного по-другому. Суть такая же: если элементы одинаковые (How классы), то мы просто должны использовать их в разных namespace’ах (указывать пакеты), тогда даже если имена элементов (классов) станут совпадать, мы все равно будем обращаться к конкретному элементу из пространства (пакета). Для примера: у нас в XML есть два element – предсказание (oracle) и БД Oracle.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<oracle>
<connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
<user value="root" />
<password value="111" />
</oracle>
<oracle>
Сегодня вы будете заняты весь день.
</oracle>
</root>
И когда мы будем обрабатывать данный XML файл, мы будем серьезно запутаны, если instead of базы данных нам придет предсказание, и обратно тоже. Для того, чтобы разрешить коллизию элементов, мы можем каждому из них выделить своё собственное пространство, чтобы различать их. Для этого есть специальный атрибут – xmlns:префикс= «уникальное meaning для namespace”. После чего, мы можем использовать префикс перед elementми, чтобы указывать, что он является частью этого namespace (по сути, мы должны создать way to пакету - namespace, а потом перед каждым элементом указывать префиксом, к Howому пакету он принадлежит).
<?xml version="1.0" encoding="UTF-8"?>
<root>
<database:oracle xmlns:database="Unique ID #1">
<connection value="jdbc:oracle:thin:@10.220.140.48:1521:test1" />
<user value="root" />
<password value="111" />
</database:oracle>
<oracle:oracle xmlns:oracle="Unique ID #2">
Сегодня вы будете заняты весь день.
</oracle:oracle>
</root>
В данном примере мы объявor два пространства имён: database и oracle. Теперь перед elementми можно использовать префиксы namespace’ов. Не нужно пугаться, если сейчас что-то неясно. На самом деле – это очень просто. Сначала, я хотел написать эту часть статьи более быстро, однако после среды я решил, что нужно уделить больше внимания данной теме, так How тут легко запутаться or в чем-то не разобраться. Now будет очень много внимания уделено атрибуту xmlns. И так, еще пример:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
<gun:shop>
<gun:guns>
<gun:gun name="Revolver" price="1250$" max_ammo="7" />
<gun:gun name="M4A1" price="3250$" max_ammo="30" />
<gun:gun name="9mm Pistol" price="450$" max_ammo="12" />
</gun:guns>
</gun:shop>
<fish:shop>
<fish:fishes>
<fish:fish name="Shark" price="1000$" />
<fish:fish name="Tuna" price="5$" />
<fish:fish name="Capelin" price="1$" />
</fish:fishes>
</fish:shop>
</root>
Мылтық сақтаудың бірегей элементтеріне арналған бос орындар мылтығын және балық аулауға арналған балықтардың бірегей элементтерін пайдалану арқылы кәдімгі XML көре аласыз. Бос орындарды жасау арқылы біз бір дүкен элементін бірден екі түрлі нәрсе үшін пайдаланғанымызды көре аласыз - қару-жарақ дүкені мен балық дүкені және біз бос орындарды жариялағанымыздың арқасында оның қандай дүкен екенін нақты білеміз. Ең қызықтысы схемалардан басталады, сол кезде біз бірдей элементтері бар әртүрлі құрылымдарды осылайша тексере аламыз. xmlns - аттар кеңістігін жариялауға арналған атрибут, оны кез келген элементте көрсетуге болады. Атау кеңістігі мәлімдемесінің мысалы:
xmlns:shop= «https://barber-shop.com/»
Қос нүктеден кейін префикс - бұл бос орын сілтемесі, содан кейін элементтердің сол кеңістіктен шыққанын көрсету үшін олардың алдында пайдалануға болады. xmlns мәні UNIQUE STRING болуы керек. Мұны түсіну өте маңызды: аттар кеңістігін жариялау үшін веб-сайт сілтемелерін немесе URI codeтарын пайдалану өте жиі кездеседі. Бұл ереже стандартты, себебі сілтеменің URI немесе URL мекенжайы бірегей, БІРАҚ бұл жерде ол өте шатастырады. Есіңізде болсын: мән сіз қалаған кез келген жол болуы мүмкін, бірақ оның бірегей және стандартты екеніне көз жеткізу үшін URL немесе URI мекенжайын пайдалану керек. Кез келген жолдарды пайдалануға болатындығы oracle мысалында көрсетілген:
xmlns:oracle="Unique ID #2"
xmlns:database="Unique ID #1"
Аттар кеңістігін жариялағанда, оны элементтің өзінде және оның ішіндегі барлық элементтерде пайдалана аласыз, осылайша түбір элементінде жарияланған аттар кеңістігі барлық элементтерде қолданылуы мүмкін. Мұны соңғы мысалда көруге болады және мұнда нақты мысал:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<el1:element1 xmlns:el1="Element#1 Unique String">
<el1:innerElement>
</el1:innerElement>
</el1:element1>
<el2:element2 xmlns:el2="Element#2 Unique String">
<el2:innerElement>
</el2:innerElement>
</el2:element2>
<el3:element3 xmlns:el3="Element#3 Unique String">
<el3:innerElement>
<el1:innerInnerElement> <!-- Так нельзя, потому что пространство el1 объявлено только в первом элементе, потому может использовать только внутри первого element и его внутренних элементов. -->
</el1:innerInnerElement>
</el3:innerElement>
</el3:element3>
</root>
Міне, маңызды деталь: түбір элементінде стандартты аттар кеңістігі де бар. Басқа аттар кеңістігін жарияласаңыз, әдепкісін қайта анықтайсыз және оны пайдалана алмайсыз. Содан кейін түбір элементінің алдына сіз бұрын жариялаған кез келген бос орын префиксін қоюыңыз керек. Дегенмен, мұны да алдауға болады: стандартты кеңістікті анық жариялауға болады. Тек xmlns-тен кейін префиксті пайдаланбай, кейбір мәндерді дереу жазып алу жеткілікті, және префикссіз барлық элементтер осы нақты аттар кеңістігіне жатады. Соңғы мысал мынаны пайдаланды:
<root xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.fish-shop.com/">
Біз стандартты кеңістікті мылтық немесе балықты пайдалану қажеттілігін болдырмау үшін ашық жарияладық, себебі түбір элементі балық аулау дүкенінің немесе қарудың нысаны емес, сондықтан бос орынды пайдалану логикалық тұрғыдан дұрыс емес. Келесі: xmlns:a және xmlns:b жасаған болсаңыз, бірақ олардың мәні бірдей болса, онда бұл бірдей кеңістік және олар бірегей емес. Сондықтан сіз әрқашан бірегей мәндерді пайдалануыңыз керек, себебі бұл ережені бұзу көптеген қателерді тудыруы мүмкін. Мысалы, егер бізде келесідей жарияланған бос орындар болса:
xmlns="https://www.standart-namespace.com/" xmlns:gun="https://www.gun-shop.com/" xmlns:fish="https://www.gun-shop.com/"
Сонда біздің балық аулайтын дүкеніміз қару-жарақ дүкеніне айналады, ал префикс бәрібір балық дүкені болып қалар еді. Бұл кеңістіктердің барлық негізгі нүктелері. Мен олардың барлығын жинап, оларды қысқартуға көп уақыт жұмсадым, содан кейін оларды нақты көрсетуге жұмсадым, өйткені Интернеттегі кеңістіктер туралы ақпарат өте үлкен және көбінесе жай су, сондықтан мұнда барлық нәрселердің көпшілігі - мен оны сынақ арқылы білдім. және қате. Егер сізде әлі де сұрақтар болса, мақаланың соңындағы сілтемелерді пайдаланып материалдарды оқып көруге болады.
XML схемасы
Бұл мақала айсбергтің ұшы ғана болатындығын бірден айтқым келеді, өйткені тақырып өте кең. Егер сіз схемалармен толығырақ танысқыңыз келсе және оларды кез-келген күрделілікте қалай жазу керектігін білгіңіз келсе, мақаланың соңында әр түрлі түрлер, шектеулер, кеңейтімдер және т.б. туралы болатын сілтеме болады. Мен теориядан бастағым келеді. Схемалар .xsd (xml схема анықтамасы) пішіміне ие және DTD-ге анағұрлым жетілдірілген және танымал балама болып табылады: олар элементтерді жасай алады, оларды сипаттай алады және т.б. Дегенмен, көптеген бонустар қосылды: типті тексеру, аттар кеңістігін қолдау және кеңірек функционалдылық. Есіңізде болсын, біз DTD туралы айтқан кезде, ол бос орындарды қолдамайтын минус болды ма? Енді біз мұны зерттегеннен кейін мен түсіндіремін: егер бірдей элементтер бар DTD-ден екі немесе одан да көп схемаларды импорттау мүмкін болса, бізде соқтығыстар (кездейсоқтықтар) болады және оларды мүлде пайдалана алмас едік, өйткені бізге қандай элемент керек екені белгісіз. XSD бұл мәселені шешеді, себебі схемаларды белгілі бір кеңістікке импорттауға және оны пайдалануға болады. Негізінде, әрбір XSD схемасының мақсатты кеңістігі бар, ол схема XML файлында қай кеңістікте жазылуы керек екенін білдіреді. Осылайша, XML файлының өзінде бізге схемаларда алдын ала анықталған бос орындарды жасап, оларға префикстерді тағайындау керек, содан кейін олардың әрқайсысына қажетті схемаларды қосу керек, содан кейін біз схемадан префикстерді алмастыра отырып, схеманың элементтерін қауіпсіз пайдалана аламыз. схемаларды импорттаған кеңістік. Сонымен, бізде мысал бар:<?xml version="1.0" encoding="UTF-8"?>
<house>
<address>ул. Есенина, дом №5</address>
<owner name="Ivan">
<telephone>+38-094-521-77-35</telephone>
</owner>
</house>
Біз оны схемамен растағымыз келеді. Алдымен бізге схема қажет:
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
<element name="house">
<complexType>
<sequence>
<element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
<element name="owner" maxOccurs="unbounded" minOccurs="0" >
<complexType>
<sequence>
<element name="telephone" type="string" />
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
Көріп отырғаныңыздай, схемалар да XML файлдары болып табылады. Сізге қажет нәрсені тікелей XML-де жазасыз. Бұл схема жоғарыдағы мысалдағы XML файлын тексеруге қабілетті. Мысалы: иесінің аты болмаса, схема мұны көреді. Сондай-ақ, реттілік элементінің арқасында мекен-жай әрқашан бірінші, содан кейін үйдің иесі болуы керек. Қарапайым және күрделі элементтер бар. Тұрақты элементтер тек кейбір деректер түрін сақтайтын элементтер болып табылады. Мысалы:
<element name="telephone" type="string" />
Жолды сақтайтын элементті осылай жариялаймыз. Бұл элементтің ішінде басқа элементтер болмауы керек. Күрделі элементтер де бар. Күрделі элементтер басқа элементтер мен атрибуттарды өз ішінде сақтауға қабілетті. Содан кейін түрін көрсетудің қажеті жоқ, тек элементтің ішіне күрделі түр жазуды бастаңыз.
<complexType>
<sequence>
<element name="address" type="string" maxOccurs="unbounded" minOccurs="0" />
<element name="owner" maxOccurs="unbounded" minOccurs="0" >
<complexType>
<sequence>
<element name="telephone" type="string" />
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
Мұны басқаша жасауға болады: күрделі типті бөлек жасап, оны түрге ауыстыруға болады. Тек осы мысалды жазу кезінде қандай да бір себептермен стандартты қолданбай, қандай да бір префикстің астындағы бос орынды жариялау қажет болды. Жалпы, бұл келесідей болды:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.nedvigimost.com/">
<xs:element name="house" type="content" />
<xs:complexType name="content">
<xs:sequence>
<xs:element name="address" type="xs:string" maxOccurs="unbounded" minOccurs="0" />
<xs:element name="owner" maxOccurs="unbounded" minOccurs="0" >
<xs:complexType>
<xs:sequence>
<xs:element name="telephone" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Осылайша, біз өз түрлерімізді бөлек жасай аламыз, содан кейін оларды type атрибутының бір жеріне ауыстыра аламыз. Бұл өте ыңғайлы, себебі ол әртүрлі жерлерде бір түрін пайдалануға мүмкіндік береді. Мен қосу схемалары туралы көбірек айтып, осы жерде аяқтағым келеді. Схеманы қосудың екі жолы бар: белгілі бір кеңістікке және жай ғана қосу.
Схеманы қосудың бірінші жолы
Бірінші әдіс схемада белгілі бір мақсатты кеңістік бар деп болжайды. Ол схема элементіндегі targetNamespace төлсипаты арқылы көрсетіледі. Содан кейін XML файлында СОЛ бос орынды жасап, сол жерде схеманы «жүктеу» жеткілікті:<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
<address>ул. Есенина, дом №5</address>
<owner name="Ivan">
<telephone>+38-094-521-77-35</telephone>
</owner>
</nedvig:house>
Екі жолды түсіну маңызды:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemeLocation="https://www.nedvigimost.com/ example_schema1.xsd"
Бірінші жол - оны есте сақтаңыз. Оны қажет жерде схемаларды жүктеуге көмектесетін нысан ретінде елестетіп көріңіз. Екінші жол - нақты жүктеу. schemaLocation бос орынмен бөлінген «мән - мән» пішінінің мәндерінің тізімін қабылдайды . Бірінші аргумент аттар кеңістігі болып табылады, ол схемадағы мақсатты аттар кеңістігіне (targetNamespace мәні) сәйкес келуі керек. Екінші аргумент схемаға қатысты салыстырмалы немесе абсолютті жол болып табылады. Және бұл ТІЗІМ мәні болғандықтан, мысалдағы схемадан кейін бос орын қойып, мақсатты кеңістікті және басқа схеманың атын қайтадан енгізіп, қалағаныңызша жалғастыра аласыз. Маңызды:Схема кейінірек бірдеңені растау үшін бұл кеңістікті жариялап, оны префикспен пайдалану керек. Соңғы мысалды мұқият қараңыз:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="https://www.nedvigimost.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.nedvigimost.com/ example_schema1.xsd">
<address>ул. Есенина, дом №5</address>
<owner name="Ivan">
<telephone>+38-094-521-77-35</telephone>
</owner>
</nedvig:house>
Біз бұл мақсатты кеңістікті nedvig префиксінде жасадық, содан кейін оны қолдандық. Осылайша, біздің элементтеріміз тексеріле бастады, өйткені біз мақсатты схема кеңістігіне сілтеме жасалған кеңістікті пайдалана бастадық.
Схеманы қосудың екінші жолы
Тізбекті қосудың екінші жолы тізбекте белгілі бір мақсатты кеңістіктің жоқтығын білдіреді. Содан кейін оны жай ғана XML файлына қосуға болады және ол оны растайды. Бұл іс жүзінде бірдей жолмен жасалады, тек XML файлында бос орындарды жариялай алмайсыз, тек схеманы қосыңыз.<?xml version="1.0" encoding="UTF-8"?>
<house xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="example_schema1.xsd">
<address>ул. Есенина, дом №5</address>
<owner name="Ivan">
<telephone>+38-094-521-77-35</telephone>
</owner>
</house>
Көріп отырғаныңыздай, бұл noNamespaceSchemaLocation көмегімен және схемаға жолды көрсету арқылы орындалады. Схемада мақсатты кеңістік болмаса да, құжат тексеріледі. Және соңғы жанасу: біз диаграммаларға басқа диаграммаларды импорттай аламыз, содан кейін бір диаграмманың элементтерін екіншісінде пайдалана аламыз. Осылайша, біз кейбір тізбектерде басқаларында бар элементтерді пайдалана аламыз. Мысалы:
Ие түрі жарияланған схема:
<?xml version="1.0" encoding="UTF-8" ?>
<schema targetNamespace="bonus" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<complexType name="owner">
<all>
<element name="telephone" type="string" />
</all>
<attribute name="name" type="string" />
</complexType>
</schema>
Бірінші схемадағы иелік түрін пайдаланатын екінші схема:
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="main" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:bonus="bonus" elementFormDefault="qualified">
<import namespace="bonus" schemaLocation="xsd2.xsd" />
<element name="house">
<complexType>
<all>
<element name="address" type="string" />
<element name="owner" type="bonus:owner" />
</all>
</complexType>
</element>
</schema>
Екінші схема келесі құрылысты пайдаланады:
<import namespace="bonus" schemaLocation="xsd2.xsd" />
Оны пайдалана отырып, біз бонустық кеңістікке түрлер мен элементтерді бір схемадан екіншісіне импорттадық. Осылайша, біз бонусқа қол жеткізе аламыз: иесі түрі. Ал келесі жолда біз оны қолдандық:
<element name="owner" type="bonus:owner" />
Сондай-ақ келесі жолға аздап назар аударыңыз:
elementFormDefault="qualified"
Бұл төлсипат схемада жарияланған және XML файлдарында әрбір элемент оның алдында айқын префикспен жариялануы керек дегенді білдіреді. Егер ол жоқ болса, онда бізге префиксі бар сыртқы элементті жариялау керек, сонымен қатар ішіндегі барлық элементтерге префикстерді орнату керек, бұл біз дәл осы схеманың элементтерін пайдаланып жатқанымызды анық көрсетеді. Міне, шын мәнінде, басқа схеманы импорттаған схемамен расталған XML файлының мысалы:
<?xml version="1.0" encoding="UTF-8"?>
<nedvig:house xmlns:nedvig="main" xmlns:bonus="bonus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="main xsd.xsd">
<nedvig:address>ул. Есенина, дом №5</nedvig:address>
<nedvig:owner name="Ivan">
<bonus:telephone>+38-094-521-77-35</bonus:telephone>
</nedvig:owner>
</nedvig:house>
Жолда:
<bonus:telephone>+38-094-521-77-35</bonus:telephone>
Бірінші схеманың мақсатты кеңістігін көрсететін бонустық аттар кеңістігін нақты жариялауымыз керек, себебі elementFormDefault білікті (тексеру), сондықтан барлық элементтер өз кеңістігін нақты көрсетуі керек.
Мақаланың соңы
Келесі мақала серияның соңғысы болады және Java арқылы XML файлдарын өңдеу туралы болады. Біз ақпаратты әртүрлі тәсілдермен және т.б. алуды үйренеміз. Бұл мақала пайдалы болды деп үміттенемін және мұнда бір жерде қателер болса да, ол сізге пайдалы және жаңа нәрсені үйретеді немесе XML файлдарын жақсырақ түсінуге мүмкіндік береді. Мұны егжей-тегжейлі зерттегісі келетіндер үшін мен шағын сілтемелер жинағын жинауды шештім:-
XSD Simple Elements - осы мақаладан оқуды бастаңыз және алға жылжыңыз, схемалар туралы барлық ақпарат сонда жиналады және азды-көпті анық, тек ағылшын тілінде түсіндіріледі. Сіз аудармашыны пайдалана аласыз.
-
аттар кеңістігіндегі бейне, егер біріншісі анық болмаса, бір нәрсеге басқа көзқарасты тыңдау әрқашан пайдалы.
-
XML аттар кеңістігі аттар кеңістігін пайдаланудың жақсы мысалы болып табылады және өте жан-жақты.
-
XML негіздері - аттар кеңістігі - аттар кеңістігі туралы тағы бір қысқа мақала.
-
Элементтерді анықтау үшін XML схемасын пайдалану негіздері де схемалар бойынша өте пайдалы анықтама болып табылады, бірақ оны материалды тереңірек зерттей отырып, баяу және мұқият оқып шығу керек.
GO TO FULL VERSION