带有数据的XML Schema?我如何用JS解析它?

时间:2012-01-14 19:04:06

标签: javascript xml parsing schema

我有一个XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xsd:element name="event">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="id" type="xsd:integer">55147</xsd:element>
            <xsd:element name="opponent" type="xsd:string">Mount Pleasant</xsd:element>
            <xsd:element name="game_date" type="xsd:string">2012-01-09</xsd:element>
            <xsd:element name="start_time" type="xsd:string">6:00pm</xsd:element>
            <xsd:element name="end_time" type="xsd:string"></xsd:element>
            <xsd:element name="sport" type="xsd:string">Basketball</xsd:element>
            <xsd:element name="level" type="xsd:string">Freshman</xsd:element>
            <xsd:element name="gender" type="xsd:string">Boys</xsd:element>
            <xsd:element name="year" type="xsd:string">2012</xsd:element>
            <xsd:element name="season" type="xsd:string">Winter</xsd:element>
            <xsd:element name="status" type="xsd:string"></xsd:element>
            <xsd:element name="homeaway" type="xsd:string">Away</xsd:element>
            <xsd:element name="facility"></xsd:element>
            <xsd:element name="facility_id" type="xsd:integer"></xsd:element>
            <xsd:element name="opponent">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="ss_id" type="xsd:integer">126</xsd:element>
                        <xsd:element name="name" type="xsd:string">Mount Pleasant</xsd:element>
                        <xsd:element name="score" type="xsd:string"></xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="location">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="ss_id" type="xsd:integer">1700</xsd:element>
                        <xsd:element name="name" type="xsd:string">Mt. Pleasant High School</xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="score">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="result" type="xsd:string"></xsd:element>
                        <xsd:element name="ours" type="xsd:string"></xsd:element>
                        <xsd:element name="theirs" type="xsd:string"></xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="league" type="xsd:string"></xsd:element>
            <xsd:element name="type" type="xsd:string">Game</xsd:element>
            <xsd:element name="ss_id" type="xsd:string">7504900</xsd:element>
            <xsd:element name="transportation" type="xsd:string"></xsd:element>
            <xsd:element name="dismissal" type="xsd:string"></xsd:element>
            <xsd:element name="return" type="xsd:string"></xsd:element>
            <xsd:element name="comment">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="school" type="xsd:string"></xsd:element>
                        <xsd:element name="conference" type="xsd:string"></xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

我试过了:

var itemList = xml.documentElement.getElementsByTagName("event");
var game_date = itemList.getElementsByTagName("game_date").text;

在javascript中能够解析它并从中获取信息。我想从这里的标签中读取数据。我在将数据拉出时遇到问题,因为这看起来像是一个包含数据的模式。这应该发生吗?

2 个答案:

答案 0 :(得分:2)

由于XML结构相当复杂,我会使用XPath来提取信息。要稍微复杂一点,您需要一个名称空间解析器函数来处理xsd前缀。

// Namespace resolver function
function nsResolver(prefix) {  
  var ns = {  
    'xsd' : 'http://www.w3.org/2001/XMLSchema'
  };  
  return ns[prefix] || null;  
} 

提取代码

// Get a NodeList of all "event" elements
var eventNodeList = document.evaluate('/xsd:schema/xsd:element[@name="event"]', document, nsResolver, XPathResult.ANY_TYPE, null );  

// Iterate over events
var currentEvent = eventNodeList.iterateNext();  
while (currentEvent) {  
  // Get value from "game_date" element
  var gameDate = document.evaluate('/xsd:complexType/xsd:sequence/xsd:element[@name="game_date"]/text()', currentEvent, nsResolver, XPathResult.ANY_TYPE,null).textContent

  // Do something with the value
  // ...

  // Get next event element
  currentEvent = eventNodeList.iterateNext();  
}

答案 1 :(得分:0)

指定的XML文件是XML架构(xsd)。 XML模式本身就是一个XML文档,但它描述了声称遵守模式的XML文档的允许元素,属性和值的结构,契约。

如果你检查javascript代码,你可以尝试提取标签名为“event”的元素,而指定的XML模式则包含名为“xsd:element”,“xsd:sequence”等元素。有点令人困惑的是,XML模式实际上包含值,这并不常见。也许这是试图举例说明价值观?

上述XML模式的XML实例或文档看起来像这样

<event>
  <id>55147</id>
  <opponent>Mount Pleasant</opponent>
  ....
</event>