Как запросить XML с помощью эквивалентной команды WHERE в Javascript - PullRequest
1 голос
/ 05 октября 2011

Мне действительно нужна помощь в запросе XML-файла с использованием xPath в Javacript, где определенный тег = определенные данные.

Скажем, например:

<bookstore>
 <b1:book>
  <name>Hungry Teddy</name>
  <author>Bozo</author</author>
  <category>fiction</category>
 </b1:book>
 <b1:book>
  <name>Funny Kangaroo</name>
  <author>Bozo</author</author>
  <category>non-fiction</category>
 </b1:book>
 <b1:book>
  <name>How to JAVA</name>
  <author>umm510</author>
  <category>fiction</category>
 </b1:book>
</bookstore>

Как я могу запросить этот XML-файл, используя Javascript, чтобы отображать данные только из тегов, ГДЕ категория = фантастика ?????

Вот пример текущего кода, который не работает:

<html>
<body>
<script type="text/javascript">

function loadXMLDoc(dname)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else
  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",dname,false);
xhttp.send("");
return xhttp.responseXML;
}
xml=loadXMLDoc("bookstore.xml");
var name = "/bookstore/b1:book/name";
var category = "/bookstore/b1:book/category";

if (typeof xml.evaluate !== 'undefined')
{
//Lets assume I have filled in all the required checks for URL's and namespaces for prefix b1
//Using nodes for name and nodes2 for category


var name=nodes.iterateNext();
var category=nodes2.iterateNext();

while(category.childNodes[0].nodeValue=="fiction")
{
document.write(name.childNodes[0].nodeValue);
}

}
else if (typeof xml.selectNodes !== 'undefined' && typeof xml.setProperty != 'undefined')
{

//IE Part which I'm not fussed about as I'll just convert from firefox implementation

}
</script>
</body>
</html>

Отредактировано Extra:

<?xml version="1.0" encoding="UTF-8"?>

<!--Terminal Area Forecast (TAF) Transformation to WXXM  Copyright 2010 La Trobe University - AirServices Australia project. All rights reserved.--><asa:AustralianTAFProduct xsi:schemaLocation="http://www.airservicesaustralia.com.au C:/wxxm/AustralianProductsSchemas/AustralianTAFproduct.xsd" gml:id="ID_46c691d5-aa88-4ca6-9879-1e507f065b32" xmlns:uuid="xalan://java.util.UUID" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wx="http://www.eurocontrol.int/wx/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:om="http://www.opengis.net/om/1.0/gml32" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:avwx="http://www.eurocontrol.int/avwx/1.1" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:asa="http://www.airservicesaustralia.com.au">
   <avwx:rawText>TAF YMGB 180015Z 1802/1811
11010KT 9999 SCT025
RMK
T 30 32 29 28 Q 1011 1009 1008 1011
</avwx:rawText>
   <!--Forecast Items-->
   <!--WXXM Schema {avwx:aerodromeWxForecast} feature-->
   <avwx:aerodromeWxForecast>
      <wx:Forecast gml:id="ID_58c3f598-575c-45c5-8988-7a5146864292">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_f3bdffee-a2c6-4d05-8097-e32943c1a5f8">
               <gml:beginPosition>2010-12-18T 02:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 11:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:AerodromeWxForecast"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fc"/>
         <om:parameter/>
         <om:result>
            <avwx:AerodromeWxForecast gml:id="ID_9449d9d2-601c-4187-8ff5-e25feaf815e4">
               <wx:validTime>
                  <gml:TimePeriod gml:id="ID_72b7a40b-c57b-47d6-88af-94ffbe6aaab4">
                     <gml:beginPosition>2010-12-18T 02:00:00Z</gml:beginPosition>
                     <gml:endPosition>2010-12-18T 11:00:00Z</gml:endPosition>
                  </gml:TimePeriod>
               </wx:validTime>
               <avwx:windDirection uom="deg">110</avwx:windDirection>
               <avwx:horizontalVisibility>
                  <avwx:HorizontalVisibility gml:id="ID_0738e74a-2b6e-4e7f-9e7b-2cf5456a18b3">
                     <avwx:minimumVisibility uom="km">10</avwx:minimumVisibility>
                  </avwx:HorizontalVisibility>
               </avwx:horizontalVisibility>
               <avwx:windSpeed uom="kt">10</avwx:windSpeed>
               <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982775">
                     <wx:base uom="ft">2500</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
               <!--End of Forecast Items-->
            </avwx:AerodromeWxForecast>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <!--Trend Condition Items-->
   <!--In support of Australian Significant Changes and Variations as described in the Bureau of Meteorology Aeronautical Services Handbook InterTempoChanges GradualChanges SignificantChanges PoorVisibilityChanges-->
   <!--Temperature and QNH Trend Forecasts-->
   <!--In support of Australian Temperature and QNH Interval Forecasts as described in the Bureau of Meteorology Aeronautical Services Handbook-->
   <!--Valid Period Start  -->
   <!--Valid Period Start plus three hours-->
   <!--Valid Period Start plus six hours-->
   <!--Valid Period Start plus nine hours-->
   <!--This concept does not exist in WXXM however a mapping was be made to {aerodromeWxForecast} feature-->
   <avwx:aerodromeWxForecast>

      <wx:Forecast gml:id="ID_b128bee2-e4e6-4463-9739-ea84df97caeb">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_8c240bbb-5e96-47f9-8be3-3ccc3bf143e6">
               <gml:beginPosition>2010-12-18T 02:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 05:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:TREND"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fc"/>
         <om:result>
            <avwx:TREND gml:id="ID_bc50099f-45a6-4348-8294-964d20a3003c">
               <avwx:forecast>
                  <wx:Forecast gml:id="ID_3cf3d5a8-cf3d-4d7f-90f9-f68f6afbfbbf">
                     <om:samplingTime/>
                     <om:procedure/>
                     <om:observedProperty/>
                     <om:featureOfInterest/>
                     <om:parameter/>
                     <om:result>
                        <wx:validTime>
                           <gml:TimePeriod gml:id="ID_f8b9fa36-783b-4c88-9e63-244d89cc7d1e">
                              <gml:beginPosition>2010-12-18T 02:00:00Z</gml:beginPosition>
                              <gml:endPosition>2010-12-18T 05:00:00Z</gml:endPosition>
                           </gml:TimePeriod>
                        </wx:validTime>
                        <avwx:windDirection uom="deg">160</avwx:windDirection>
                        <avwx:windSpeed uom="kt">30</avwx:windSpeed>
                        <avwx:airTemperature>30</avwx:airTemperature>
                        <avwx:qnh>1011</avwx:qnh>
                        <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982775">
                     <wx:base uom="ft">2500</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
                     </om:result>
                  </wx:Forecast>
               </avwx:forecast>
            </avwx:TREND>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <avwx:aerodromeWxForecast>
      <wx:Forecast gml:id="ID_19df8738-be93-4c1a-af9f-d818f6e058c6">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_37f26807-9497-4fdd-8cf7-96fc800a3b48">
               <gml:beginPosition>2010-12-18T 05:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 08:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:TREND"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fc"/>
         <om:result>
            <avwx:TREND gml:id="ID_85f3b9ea-21d1-4237-ac8b-4767bf33cc32">
               <avwx:forecast>
                  <wx:Forecast gml:id="ID_968fdbcf-3129-48f0-8b0d-331dc2185bdf">
                     <om:samplingTime/>
                     <om:procedure/>
                     <om:observedProperty/>
                     <om:featureOfInterest/>
                     <om:parameter/>
                     <om:result>
                        <wx:validTime>
                           <gml:TimePeriod gml:id="ID_f211f02d-83fb-407b-b0c7-d06669fa148c">
                              <gml:beginPosition>2010-12-18T 05:00:00Z</gml:beginPosition>
                              <gml:endPosition>2010-12-18T 08:00:00Z</gml:endPosition>
                           </gml:TimePeriod>
                        </wx:validTime>
                        <avwx:airTemperature>32</avwx:airTemperature>
                        <avwx:qnh>1009</avwx:qnh>
                        <avwx:windDirection uom="deg">170</avwx:windDirection>
                        <avwx:windSpeed uom="kt">25</avwx:windSpeed>
                        <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982775">
                     <wx:base uom="ft">3100</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
                     </om:result>
                  </wx:Forecast>
               </avwx:forecast>
            </avwx:TREND>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <avwx:aerodromeWxForecast>
      <wx:Forecast gml:id="ID_67ea2cd9-5f3a-4837-994e-26fc216cac8b">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_8d662056-a8e6-416c-a3e1-7765aef94a85">
               <gml:beginPosition>2010-12-18T 08:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 11:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:TREND"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fc"/>
         <om:result>
            <avwx:TREND gml:id="ID_2386470b-d17b-4c38-9718-5cdb44075550">
               <avwx:forecast>
                  <wx:Forecast gml:id="ID_44a09991-25d1-423d-a994-4b62c256272a">
                     <om:samplingTime/>
                     <om:procedure/>
                     <om:observedProperty/>
                     <om:featureOfInterest/>
                     <om:parameter/>
                     <om:result>
                        <wx:validTime>
                           <gml:TimePeriod gml:id="ID_f59bec03-a4f0-4493-b50a-48a03db7a1d2">
                              <gml:beginPosition>2010-12-18T 08:00:00Z</gml:beginPosition>
                              <gml:endPosition>2010-12-18T 11:00:00Z</gml:endPosition>
                           </gml:TimePeriod>
                        </wx:validTime>
                        <avwx:airTemperature>29</avwx:airTemperature>
                        <avwx:qnh>1008</avwx:qnh>
                        <avwx:windDirection uom="deg">180</avwx:windDirection>
                        <avwx:windSpeed uom="kt">41</avwx:windSpeed>
                        <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982775">
                     <wx:base uom="ft">2200</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
                     </om:result>
                  </wx:Forecast>
               </avwx:forecast>
            </avwx:TREND>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <avwx:aerodromeWxForecast>
      <wx:Forecast gml:id="ID_c0f73f45-53c9-4e0a-b053-030b641fb978">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_ff2336d7-aec7-48dd-b21e-09f9fc18af2a">
               <gml:beginPosition>2010-12-18T 11:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 14:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:TREND"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fc"/>
         <om:result>
            <avwx:TREND gml:id="ID_eb92fcee-ea8b-4d9e-af96-c60a8747df70">
               <avwx:forecast>
                  <wx:Forecast gml:id="ID_c54eaedc-a082-4cb9-acca-2951dafd4855">
                     <om:samplingTime/>
                     <om:procedure/>
                     <om:observedProperty/>
                     <om:featureOfInterest/>
                     <om:parameter/>
                     <om:result>
                        <wx:validTime>
                           <gml:TimePeriod gml:id="ID_9828228e-8152-4c30-8107-7e1a86974a64">
                              <gml:beginPosition>2010-12-18T 11:00:00Z</gml:beginPosition>
                              <gml:endPosition>2010-12-18T 14:00:00Z</gml:endPosition>
                           </gml:TimePeriod>
                        </wx:validTime>
                        <avwx:airTemperature>28</avwx:airTemperature>
                        <avwx:qnh>1011</avwx:qnh>
                        <avwx:windDirection uom="deg">190</avwx:windDirection>
                        <avwx:windSpeed uom="kt">20</avwx:windSpeed>
                        <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982775">
                     <wx:base uom="ft">1500</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
                     </om:result>
                  </wx:Forecast>
               </avwx:forecast>
            </avwx:TREND>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <!--End Temperature and QNH Trend Forecasts-->
   <!--End of Trend Condition Items-->
   <avwx:appliesTo>
      <avwx:Aerodrome gml:id="ID_d5dbad50-401d-442a-b74c-58a58758d6fc">
         <gml:name>MANSFIELD</gml:name>
         <gml:location>
            <gml:Point gml:id="ID_a85a0f15-deb9-4d6d-96d1-4818fafc3556">
               <gml:coordinates>134.893530555556,-12.0944666666667</gml:coordinates>
            </gml:Point>
         </gml:location>
         <avwx:icaoCode>YMGB</avwx:icaoCode>
         <!--Integration feature with AIXM-->
      </avwx:Aerodrome>
   </avwx:appliesTo>
   <avwx:issueTime>2010-12-18T00:15:00Z</avwx:issueTime>
   <avwx:type>TAF</avwx:type>
   <asa:AFTNheader>CBJ0338 180015
GG YBZZABEX
180015 YPDMYMYX</asa:AFTNheader>
   <asa:stationID/>
   <!--The Australian TAF product extension items-->



      //NEWLY ADDED
      <avwx:aerodromeWxForecast>
      <wx:Forecast gml:id="ID_c0f73f45-53c9-4e0a-b053-030b641fb979">
         <om:samplingTime>
            <gml:TimePeriod gml:id="ID_ff2336d7-aec7-48dd-b21e-09f9fc18af2b">
               <gml:beginPosition>2010-12-18T 11:00:00Z</gml:beginPosition>
               <gml:endPosition>2010-12-18T 14:00:00Z</gml:endPosition>
            </gml:TimePeriod>
         </om:samplingTime>
         <om:procedure/>
         <om:observedProperty xlink:href="http://www.eurocontrol.int/ont/avwx/1.1/wx.owl#avwx:TREND"/>
         <om:featureOfInterest xlink:href="#ID_d5dbad50-401d-442a-b74c-58a58758d6fd"/>
         <om:result>
            <avwx:TREND gml:id="ID_eb92fcee-ea8b-4d9e-af96-c60a8747df70">
               <avwx:forecast>
                  <wx:Forecast gml:id="ID_c54eaedc-a082-4cb9-acca-2951dafd4856">
                     <om:samplingTime/>
                     <om:procedure/>
                     <om:observedProperty/>
                     <om:featureOfInterest/>
                     <om:parameter/>
                     <om:result>
                        <wx:validTime>
                           <gml:TimePeriod gml:id="ID_9828228e-8152-4c30-8107-7e1a86974a65">
                              <gml:beginPosition>2010-12-18T 11:00:00Z</gml:beginPosition>
                              <gml:endPosition>2010-12-18T 14:00:00Z</gml:endPosition>
                           </gml:TimePeriod>
                        </wx:validTime>
                        <avwx:airTemperature>28</avwx:airTemperature>
                        <avwx:qnh>1011</avwx:qnh>
                        <avwx:windDirection uom="deg">200</avwx:windDirection>
                        <avwx:windSpeed uom="kt">20</avwx:windSpeed>
                        <avwx:cloudCondition>
                  <wx:CloudCondition gml:id="ID_69351345-8054-411e-9db5-87f365982776">
                     <wx:base uom="ft">1500</wx:base>
                     <wx:cloudAmount>SCATTERED</wx:cloudAmount>
                  </wx:CloudCondition>
               </avwx:cloudCondition>
                     </om:result>
                  </wx:Forecast>
               </avwx:forecast>
            </avwx:TREND>
         </om:result>
      </wx:Forecast>
   </avwx:aerodromeWxForecast>
   <!--End Temperature and QNH Trend Forecasts-->
   <!--End of Trend Condition Items-->
   <avwx:appliesTo>
      <avwx:Aerodrome gml:id="ID_d5dbad50-401d-442a-b74c-58a58758d6fd">
         <gml:name>BIRCHIP</gml:name>
         <gml:location>
            <gml:Point gml:id="ID_a85a0f15-deb9-4d6d-96d1-4818fafc3558">
               <gml:coordinates>134.893530555556,-12.0944666666667</gml:coordinates>
            </gml:Point>
         </gml:location>
         <avwx:icaoCode>YBIR</avwx:icaoCode>
         <!--Integration feature with AIXM-->
      </avwx:Aerodrome>
   </avwx:appliesTo>
   <avwx:issueTime>2010-12-18T00:15:00Z</avwx:issueTime>
   <avwx:type>TAF</avwx:type>
   <asa:AFTNheader>CBJ0338 180015
GG YBZZABEX
180015 YPDMYMYX</asa:AFTNheader>
   <asa:stationID/>


</asa:AustralianTAFProduct>

Как извлечь данные из "/ asa: AustralianTAFProduct // wx: Forecast / om: samplingTime / gml: TimePeriod / gml: beginPosition" только if "/ asa: AustralianTAFProduct // gml: name" = MANSFIELD ??? ? Как мне применить это условие? Обратите внимание, что существует 2 тега gml: name - один = MANSFIELD, а другой = BIRCHIP

Новые данные XML находятся под комментарием // NEWDDED

Я использовал timeBegin="/asa:AustralianTAFProduct[.//gml:name=\"BIRCHIP\"]//wx:Forecast/om:samplingTime/gml:TimePeriod/gml:beginPosition";, как предложено командой xquib, но это возвращает значение времени для ОБА MANSFIELD и BIRCHIP :( Любые дальнейшие предложения ???

gml: имя находится в конце документа XML, если вы не можете его найти. Извините, я загрузил большой XML-файл, но это облегчает мои объяснения

Любая помощь будет принята с благодарностью !!!!! Примечание: ответ команды xqib отлично сработал для фрагмента XML, прежде чем я обновил его! Отличная работа, ребята! Я искренне ценю это <3 </p>

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Следующие выражения XPath выбирают все имена, соответствующие категории «художественная литература»:

/bookstore/b1:book[category="fiction"]/name

Обратите внимание, что документ выше не является правильно сформированным пространством имен, поскольку префикс b1 не связан с пространством имен,Это может быть причиной того, что ваш код не работает.Вот как это можно исправить:

<bookstore xmlns:b1="http://www.example.com">
  <b1:book>
    <name>Hungry Teddy</name>
    <author>Bozo</author>
    <category>fiction</category>
  </b1:book>
  <b1:book>
    <name>Funny Kangaroo</name>
    <author>Bozo</author>
    <category>non-fiction</category>
   </b1:book>
   <b1:book>
    <name>How to JAVA</name>
    <author>umm510</author>
    <category>fiction</category>
  </b1:book>
</bookstore>

Редактировать: В некоторых тегах автора также были ошибки правильной формы.

0 голосов
/ 05 октября 2011

Вот попытка ответить на ваш второй вопрос, без использования идентификаторов, при условии, что для всего документа есть одно имя.Следующий XPath

/asa:AustralianTAFProduct[.//gml:name="MANSFIELD"]//wx:Forecast/om:samplingTime/gml:TimePeriod/gml:beginPosition

либо вернет все узлы в:

/asa:AustralianTAFProduct//wx:Forecast/om:samplingTime/gml:TimePeriod/gml:beginPosition

, если верно следующее:

/asa:AustralianTAFProduct//gml:name="MANSFIELD"

, либо в противном случае вернет пустойпоследовательность.

...