>  기사  >  백엔드 개발  >  미친 XML 연구 노트(6) -----------XML 확장

미친 XML 연구 노트(6) -----------XML 확장

黄舟
黄舟원래의
2017-02-21 14:33:471569검색

XML의 기본 지식과 형식 요구 사항은 여기서 논의하지 않습니다

다음은 XML의 기본 사항을 요약한 것입니다

첫 만남

http://www.php.cn/

기본

http://www.php .cn/

다음은 XML 속성 및 유효성 검사를 포함하는 XML 확장입니다.


XML 요소는 HTML과 마찬가지로 여는 태그에 속성을 포함할 수 있습니다.

속성은 요소에 대한 추가 정보를 제공합니다.

XML 속성

HTML에서 다음을 기억하실 것입니다: 08c069fd51d2c2d81cee4e0f0ed64316 "src" 속성은 a1f02c36ba31691bcfe87b2722de723b 요소에 대한 추가 정보를 제공합니다.

HTML(및 XML)에서 속성은 요소에 대한 추가 정보를 제공합니다.

<img src="computer.gif">
<a href="demo.asp">

속성은 종종 데이터의 일부가 아닌 정보를 제공합니다. 다음 예에서 파일 형식은 데이터와 관련이 없지만 이 요소를 처리해야 하는 소프트웨어에는 중요합니다.

<file type="gif">computer.gif</file>

XML 속성은 인용되어야 합니다

속성 값은 따옴표로 묶어야 하지만, 작은따옴표와 큰따옴표 모두 사용할 수 있습니다. 예를 들어, 개인의 성별, 개인 태그는 다음과 같이 작성할 수 있습니다:

<person sex="female">

또는 다음과 같이 작성할 수도 있습니다:

<person sex=&#39;female&#39;>

참고: 속성 값 자체에 큰따옴표가 포함된 경우 다음 예와 같이 작은따옴표로 묶어야 합니다.

<gangster name=&#39;George "Shotgun" Ziegler&#39;>

또는 엔터티 참조를 사용할 수 있습니다.

<gangster name="George &quot;Shotgun&quot; Ziegler">

XML 요소 대 속성

다음 예를 참조하세요.

<person sex="female">
  Anna
  Smith
 


  female
  Anna
  Smith

첫 번째 예에서 sex는 속성입니다. 두 번째 예에서 sex는 하위 요소입니다. 두 예제 모두 동일한 정보를 제공합니다.

속성을 사용할 시기와 하위 요소를 사용할 시기를 알려주는 규칙은 없습니다. 내 경험에 따르면 HTML에서는 속성이 사용하기 편리하지만 XML에서는 속성 사용을 피해야 합니다. 정보가 데이터와 유사하다고 느껴지면 하위 요소를 사용하세요.

내가 가장 좋아하는 방식

다음 세 개의 XML 문서에는 정확히 동일한 정보가 포함되어 있습니다.

첫 번째 예제에서는 다음을 사용합니다. 날짜 속성:

<note date="08/08/2008">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>

두 번째 예에서는 날짜 요소를 사용합니다.

<note>
<date>08/08/2008</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>

세 번째 예에서는 확장 날짜 요소를 사용합니다(이것이 제가 가장 좋아하는 것입니다):

<note>
<date>
  <day>08</day>
  <month>08</month>
  <year>2008</year>
</date>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>

XML 속성을 피하시나요?

속성 사용으로 인해 발생하는 몇 가지 문제:

  • 속성은 여러 값을 포함할 수 없습니다(요소는 가능).

  • 속성은 트리 구조를 설명할 수 없습니다(요소는 가능)

  • 속성은 쉽게 확장할 수 없습니다(향후 변경을 위해)

  • 속성은 다음과 같습니다. 읽기 어렵고 유지 관리

데이터를 설명하는 요소를 사용해 보세요. 대신, 데이터 독립적인 정보를 제공하기 위해 속성을 사용하세요.

다음과 같은 어리석은 짓을 하지 마십시오(XML을 사용하는 방식이 아닙니다).

<note day="08" month="08" year="2008"
to="George" from="John" heading="Reminder" 
body="Don&#39;t forget the meeting!">
</note>

메타데이터의 XML 속성

때때로 ID 참조가 요소에 할당됩니다. 이러한 ID 인덱스는 HTML의 ID 속성과 동일한 방식으로 XML 요소를 식별하는 데 사용할 수 있습니다.

<messages>
  <note id="501">
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don&#39;t forget the meeting!</body>
  </note>
  <note id="502">
    <to>John</to>
    <from>George</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note> 
</messages>

위의 ID는 단지 다른 노트를 식별하는 데 사용되는 식별자일 뿐입니다. 노트 데이터의 일부가 아닙니다.

여기서 전달하려는 아이디어는 메타데이터(데이터에 관한 데이터)는 속성으로 저장되어야 하고, 데이터 자체는 요소로 저장되어야 한다는 것입니다.

XML 유효성 검사


올바른 구문을 사용하는 XML을 "잘 구성된" XML이라고 합니다.

DTD에 대해 유효성이 검사된 XML은 "유효한" XML입니다.

잘 구성된 XML 문서

"잘 구성된" XML 문서에는 올바른 구문이 있습니다.

"잘 구성된" XML 문서는 이전 장에서 소개한 XML 구문 규칙을 따릅니다.

  • XML 문서에는 루트 요소가 있어야 합니다.

  • XML 문서에는 닫는 태그가 있어야 합니다

  • XML 태그는 대소문자를 구분합니다

  • XML 요소는 정확해야 합니다.

  • XML 속성은 인용되어야 합니다

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>

XML 문서 유효성 검사

유효한 XML 문서는 문서 유형 정의(DTD)의 구문 규칙을 준수하는 "잘 구성된" XML 문서입니다.

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE note SYSTEM "Note.dtd"><note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don&#39;t forget the meeting!</body>
</note>

위 예에서 DOCTYPE 선언은 외부 DTD에 대한 것입니다. 파일 견적. 다음 단락에서는 이 파일의 내용을 보여줍니다.

XML DTD

DTD의 기능은 XML 문서의 구조를 정의하는 것입니다. 일련의 법적 요소를 사용하여 문서 구조를 정의합니다:

<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>

DTD 요약:

http://www.php.cn/

XML 스키마

<xs:element name="note">

<xs:complexType>
  <xs:sequence>
    <xs:element name="to"      type="xs:string"/>
    <xs:element name="from"    type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body"    type="xs:string"/>
  </xs:sequence>
</xs:complexType>

</xs:element>

범용 유효성 검사기

XML 错误会终止您的程序

XML 文档中的错误会终止你的 XML 程序。

W3C 的 XML 规范声明:如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。理由是,XML 软件应当轻巧,快速,具有良好的兼容性。

如果使用 HTML,创建包含大量错误的文档是有可能的(比如你忘记了结束标签)。其中一个主要的原因是 HTML 浏览器相当臃肿,兼容性也很差,并且它们有自己的方式来确定当发现错误时文档应该显示为什么样子。

使用 XML 时,这种情况不应当存在。

对您的 XML 进行语法检查 - 仅用于 IE 浏览器

为了帮助您对 XML 进行语法检查,我们创建了一个 XML 验证器。

把您的 XML 粘贴到下面的文本框中,然后点击"验证"按钮来进行语法检查。

根据 DTD 来验证 XML

只要把 DOCTYPE 声明添加到您的 XML 中,然后点击验证按钮即可:

注释:只有在 Internet Explorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点。

 

如何将XML显示在Html上:

 

实例

  • 从 XML 文件中加载数据,然后把数据显示为一个 HTML 表格

在 HTML 中显示数据

在上一节中,我们讲解了如何通过 JavaScript 来解析 XML 并访问 DOM。

本例遍历一个 XML 文件 (cd_catalog.xml),然后把每个 CD 元素显示为一个 HTML 表格行:

<html>
<body>

<script type="text/javascript">
var xmlDoc=null;
if (window.ActiveXObject)
{// code for IExmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation.createDocument)
{// code for Mozilla, Firefox, Opera, etc.xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert(&#39;Your browser cannot handle this script&#39;);
}
if (xmlDoc!=null)
{
xmlDoc.async=false;
xmlDoc.load("cd_catalog.xml");

document.write("<table border=&#39;1&#39;>");

var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{ 
document.write("<tr>");
document.write("<td>");
document.write(
x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td>");

document.write("<td>");
document.write(
x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");
}
</script>

</body>
</html>

 

例子解释:

  1. 检测浏览器,然后使用合适的解析器来加载 XML

  2. 创建一个 HTML 表格(c3eabfe0f2ab8a9eadae05ced4d2507b)

  3. 使用 getElementsByTagName() 来获得所有 XML 的 CD 节点

  4. 针对每个 CD 节点,把 ARTIST 和 TITLE 中的数据显示为表格数据

  5. 用 f16b1740fad44fb09bfe928bcc527e08 结束表格

 

XMLHttpRequest

 

什么是 XMLHttpRequest 对象?

XMLHttpRequest 对象是开发者的梦想,因为您能够:

  • 在不重新加载页面的情况下更新网页

  • 在页面已加载后从服务器请求数据

  • 在页面已加载后从服务器接收数据

  • 在后台向服务器发送数据

所有现代的浏览器都支持 XMLHttpRequest 对象。

实例:当键入文本时与服务器进行 XML HTTP 通信

创建 XMLHttpRequest 对象

通过一行简单的 JavaScript 代码,我们就可以创建 XMLHttpRequest 对象。

在所有现代浏览器中(包括 IE 7):

xmlhttp=new XMLHttpRequest()

在 Internet Explorer 5 和 6 中:

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")

实例

TIY

注释:onreadystatechange 是一个事件句柄。它的值 (state_Change) 是一个函数的名称,当 XMLHttpRequest 对象的状态发生改变时,会触发此函数。状态从 0 (uninitialized) 到 4 (complete) 进行变化。仅在状态为 4 时,我们才执行代码。

为什么使用 Async=true ?

我们的实例在 open() 的第三个参数中使用了 "true"。

该参数规定请求是否异步处理。

True 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应。

onreadystatechange 事件使代码复杂化了。但是这是在没有得到服务器响应的情况下,防止代码停止的最安全的方法。

通过把该参数设置为 "false",可以省去额外的 onreadystatechange 代码。如果在请求失败时是否执行其余的代码无关紧要,那么可以使用这个参数。

 

XML实例:

XML 文档实例

请看下面这个 XML 文档 ( "cd_catalog.xml" ),它描述了一个 CD 目录:

<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
.
.
... more ...
.

 

加载 XML 文档

为了加载 XML 文档 (cd_catalog.xml),我们使用了与 XML 解析器那一节中相同的代码:

var xmlDoc;
if (window.ActiveXObject)
  {  // code for IE
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
else if (document.implementation.createDocument)
  {  // code for Firefox, Mozilla, Opera, etc.
  xmlDoc=document.implementation.createDocument("","",null);
  }
else
  {
  alert(&#39;Your browser cannot handle this script&#39;);
  }
xmlDoc.async=false;
xmlDoc.load("cd_catalog.xml");

在本代码执行后,xmlDoc 成为一个 XML DOM 对象,可由 JavaScript 访问。

把 XML 数据显示为 HTML 表格

以下代码使用来自 XML DOM 对象的数据来填充一个 HTML 表格:

document.write("<table border=&#39;1&#39;>");

var x=xmlDoc.getElementsByTagName("CD");
for (var i=0;i<x.length;i++)
{ 
document.write("<tr>");
document.write("<td>");
document.write(
x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td>");

document.write("<td>");
document.write(
x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");

针对 XML 文档中的每个 CD 元素,会创建一个表格行。每个表格行包含两个表格数据单元,其中的数据来自当前 CD 元素的 ARTIST 和 TITLE。

 

在任意 HTML 元素中显示 XML 数据

XML 数据可以拷贝到任何有能力显示文本的 HTML 元素。

下面的代码为 HTML 文件的 93f0f5c25f18dab9d176bd4f6de5d30e 部分。这段代码从第一个 d15114bf3dc8d8fe2e2887944c735e50 元素中获得 XML 数据,然后在 id="show" 的 HTML 元素中显示数据:

var x=xmlDoc.getElementsByTagName("CD");
i=0;

function display()
{
artist=
(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
title=
(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
year=
(x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue);

txt="Artist: "+artist+"<br />Title: "+title+"<br />Year: "+year;

document.getElementById("show").innerHTML=txt;
}

HTML 的 body 元素包含一个 onload 事件属性,它的作用是在页面已经加载时调用 display() 函数。body 元素中还包含了供接受 XML 数据的 a1862d91ae37e8ab9716d1c936937a12 元素。

<p id=&#39;show&#39;></p>

</body>

 

通过上例,你只能看到来自 XML 文档中第一个 CD 元素中的数据。为了导航到数据的下一行,必须添加更多的代码。

添加导航脚本

为了向上例添加导航(功能),需要创建 next() 和 previous() 两个函数:

function next()
{
if (i<x.length-1)
  {
  i++;
  display();
  }
}

function previous()
{
if (i>0)
  {
  i--;
  display();
  }
}

next() 函数确保已到达最后一个 CD 元素后不显示任何东西,previous () 函数确保已到达第一个 CD 元素后不显示任何东西。

通过点击 next/previous 按钮来调用 next() 和 previous() 函数:

<input type="button" onclick="previous()" value="previous" />
<input type="button" onclick="next()" value="next" />

 

以上就是疯狂XML学习笔记(6)-----------XML拓展的内容,更多相关内容请关注PHP中文网(www.php.cn)!

 

 

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