Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用qml读取多个Xml属性_Javascript_Xml_Regex_Qt_Qml - Fatal编程技术网

Javascript 使用qml读取多个Xml属性

Javascript 使用qml读取多个Xml属性,javascript,xml,regex,qt,qml,Javascript,Xml,Regex,Qt,Qml,我在javascript(qml)中获得了XML和字符串。我的目标是过滤关于不同线路的信息。我想要一个包含行名称(属性)的对象,尤其是倒计时。对于一个行名称,有偏离计数*倒计时字段。我希望所有这些(在本例中为2)倒计时值都在一个数组中。最终的目标是在一个列表模型中加载整行:line(name,countdown(1,2,…x)) 最大的问题是访问属性。在qml中,DOM树的标准函数不受支持:“对象没有诸如getAttribute()之类的函数”,其他函数也不受支持,例如getElementByT

我在javascript(qml)中获得了XML和字符串。我的目标是过滤关于不同线路的信息。我想要一个包含行名称(属性)的对象,尤其是倒计时。对于一个行名称,有偏离计数*倒计时字段。我希望所有这些(在本例中为2)倒计时值都在一个数组中。最终的目标是在一个列表模型中加载整行:
line(name,countdown(1,2,…x))

最大的问题是访问属性。在qml中,DOM树的标准函数不受支持:“对象没有诸如getAttribute()之类的函数”,其他函数也不受支持,例如getElementByTagName()。使用XmlListModel,我可以访问属性,但前提是只有一个属性。在另一种情况下,它返回unknown(据我所知,qt中有一个bug)

我尝试了纯XmlListModel,但没有成功(请参阅:)-不支持多个条目。所以我试着找一个工作区:

要处理的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ft> 
  <response> 
    <client device="" appName="" clientId="123" appVersion=""/> 
    <responseType>api_get_monitor</responseType> 
    <responseTime>2011-05-31 14:41:13</responseTime> 
    <monitor id="36469" clientexpiration=""> 
      <lines count="24"> 
        <line name="U1" type="ptMetro" towards="Leopoldau" direction="H" platform="U1_H" barrierFree="1" realtimeSupported="1"> 
          <departures count="2"> 
            <departure> 
              <departureTime delay="" countdown="3"/> 
            </departure> 
            <departure> 
              <departureTime  delay="" countdown="6"/> 
            </departure> 
            <firstDeparture> 
              <departureTime  delay="" countdown=""/> 
            </firstDeparture> 
            <lastDeparture> 
              <departureTime  delay="" countdown=""/> 
            </lastDeparture> 
          </departures> 
        </line>
      </lines> 
    </monitor> 
    <trafficInfos/> 
    <message messageCode="1">ok</message> 
  </response> 
</ft> 
因此:

XmlListModel {
    id: attributeInterface

    onStatusChanged: {
        for (var i = 0; i < count; i++) {
            console.debug({"countdown": parseFloat(get(i).countdown) });
        }}}
XmlListModel{
id:属性接口
onStatusChanged:{
对于(变量i=0;i
我试着把属性弄出来。但问题是,赋值是无效的,因为xml元素是对象(DOM?但不存在这样的方法…)而不是文本

2正则表达式 所以我最后的赌注是使用正则表达式。有没有办法得到所有的倒计时值?这是我最好的尝试,但不知何故它只得到了一个值(我在最后尝试了+来查找所有的倒计时,但它不起作用。
/delay\=\“\d*\”。倒计时\=\”(\d*)\“+/

还有这个
for(var i=0;i在搜索和播放了2天后,我得到了它。我希望这不会再困扰任何人。
我发现有两种可能的方法:

1环 或者在DomTree上(org.question中的数字1):

这一方面是我一直在寻找的。它的文档记录不好(就像我找到的关于qml/qt的所有内容一样),但有一个属性需要读取属性字段:attributes(注意链接中的输入错误)。它是一个属性数组,所以attributes[1]。name是第二个att的名称

此后,我只需要一个简单的方法来爬树,这在org.question中有描述

2个XmlListModels 由于有一个deputure计数,可以获取所有这些计数,然后以某种方式将计数(全部在一个列表中)和相应的行(以及一行的计数信息)组合在一起

现在这只是第二个,因为如果你不知道每个节点有多少个属性,这将不起作用。顺序将丢失

XmlListModel {
    id: lineXmlModel
    query: "/ft/response/monitor/lines/line"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("lineModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line});// , "depaturesCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }
    
    // name = variable name, query fetches the data with XPATH
    XmlRole { name: "line"; query: "@name/string()" }
    
} // xmlModel



XmlListModel {
    id: depatureCountXmlModel
    query: "/ft/response/monitor/lines/line/departures"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("departureCountModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line, "depatureCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }

    XmlRole { name: "depatureCount"; query: "@count/number()" }
    
} // xmlModel



XmlListModel {
    id: countdownXmlModel
    query: "/ft/response/monitor/lines/line/departures/departure/departureTime"
    
    onStatusChanged: {
        if (status === 1 && lineXmlModel.status === 1 && depatureCountXmlModel.status === 1) {
            console.debug("CountdownModel has: "+count+" items");
            for (var i = 0; i < lineXmlModel.count; i++) {
                console.debug("Line: "+ lineXmlModel.get(i).name + " number of depatures "+ depatureCountXmlModel.get(i).depatureCount );
                // console.debug("countdown "+ parseFloat(get(i).countdown) );
                // lineListModel.append({"countdown": parseFloat(get(i).countdown) });
            }
        }
    }
    
    XmlRole { name: "countdown"; query: "@countdown/number()" }
}
XmlListModel{
id:lineXmlModel
查询:“/ft/response/monitor/line/line”
onStatusChanged:{
如果(状态===1){
调试(“lineModel有:“+count+”项”);
对于(变量i=0;i
经过两天的搜索和播放,我得到了它。我希望这不会再困扰任何人了。 我发现有两种可能的方法:

1环 或者在DomTree上(org.question中的数字1):

这一方面是我一直在寻找的。它的文档记录不好(就像我找到的关于qml/qt的所有内容一样),但有一个属性需要读取属性字段:attributes(注意链接中的输入错误)。它是一个属性数组,所以attributes[1]。name是第二个att的名称

此后,我只需要一个简单的方法来爬树,这在org.question中有描述

2个XmlListModels 由于有一个deputure计数,可以获取所有这些计数,然后以某种方式将计数(全部在一个列表中)和相应的行(以及一行的计数信息)组合在一起

现在这只是第二个,因为如果你不知道每个节点有多少个属性,这将不起作用。顺序将丢失

XmlListModel {
    id: lineXmlModel
    query: "/ft/response/monitor/lines/line"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("lineModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line});// , "depaturesCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }
    
    // name = variable name, query fetches the data with XPATH
    XmlRole { name: "line"; query: "@name/string()" }
    
} // xmlModel



XmlListModel {
    id: depatureCountXmlModel
    query: "/ft/response/monitor/lines/line/departures"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("departureCountModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line, "depatureCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }

    XmlRole { name: "depatureCount"; query: "@count/number()" }
    
} // xmlModel



XmlListModel {
    id: countdownXmlModel
    query: "/ft/response/monitor/lines/line/departures/departure/departureTime"
    
    onStatusChanged: {
        if (status === 1 && lineXmlModel.status === 1 && depatureCountXmlModel.status === 1) {
            console.debug("CountdownModel has: "+count+" items");
            for (var i = 0; i < lineXmlModel.count; i++) {
                console.debug("Line: "+ lineXmlModel.get(i).name + " number of depatures "+ depatureCountXmlModel.get(i).depatureCount );
                // console.debug("countdown "+ parseFloat(get(i).countdown) );
                // lineListModel.append({"countdown": parseFloat(get(i).countdown) });
            }
        }
    }
    
    XmlRole { name: "countdown"; query: "@countdown/number()" }
}
XmlListModel{
id:lineXmlModel
查询:“/ft/response/monitor/line/line”
onStatusChanged:{
如果(状态===1){
调试(“lineModel有:“+count+”项”);
对于(变量i=0;iXmlListModel {
    id: lineXmlModel
    query: "/ft/response/monitor/lines/line"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("lineModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line});// , "depaturesCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }
    
    // name = variable name, query fetches the data with XPATH
    XmlRole { name: "line"; query: "@name/string()" }
    
} // xmlModel



XmlListModel {
    id: depatureCountXmlModel
    query: "/ft/response/monitor/lines/line/departures"
    
    onStatusChanged: {
        if (status === 1) {
            console.debug("departureCountModel has: "+count+" items");
            for (var i = 0; i < count; i++) {
                lineListModel.append({"line": get(i).line, "depatureCount": parseFloat(get(i).depaturesCount) });
            }
        }
    }

    XmlRole { name: "depatureCount"; query: "@count/number()" }
    
} // xmlModel



XmlListModel {
    id: countdownXmlModel
    query: "/ft/response/monitor/lines/line/departures/departure/departureTime"
    
    onStatusChanged: {
        if (status === 1 && lineXmlModel.status === 1 && depatureCountXmlModel.status === 1) {
            console.debug("CountdownModel has: "+count+" items");
            for (var i = 0; i < lineXmlModel.count; i++) {
                console.debug("Line: "+ lineXmlModel.get(i).name + " number of depatures "+ depatureCountXmlModel.get(i).depatureCount );
                // console.debug("countdown "+ parseFloat(get(i).countdown) );
                // lineListModel.append({"countdown": parseFloat(get(i).countdown) });
            }
        }
    }
    
    XmlRole { name: "countdown"; query: "@countdown/number()" }
}
import QtQuick 2.0 
import QtQuick.XmlListModel 2.0


ListView 
{
  width: 300;
  height: 400; 

  spacing: 10 

  model: XmlListModel 
  {
    xml: '<?xml version="1.0" encoding="UTF-8"?> 
<ft> 
  <response> 
    <client device="" appName="" clientId="123" appVersion=""/> 
    <responseType>api_get_monitor</responseType> 
    <responseTime>2011-05-31 14:41:13</responseTime> 
    <monitor id="36469" clientexpiration=""> 
      <lines count="24"> 
    <line name="U1" type="ptMetro" towards="Leopoldau" direction="H" platform="U1_H" barrierFree="1" realtimeSupported="1"> 
      <departures count="2"> 
        <departure> 
          <departureTime delay="1" countdown="3"/> 
        </departure> 
        <departure> 
          <departureTime  delay="2" countdown="6"/> 
        </departure> 
        <firstDeparture> 
          <departureTime  delay="3" countdown="99"/> 
        </firstDeparture> 
        <lastDeparture> 
          <departureTime  delay="4" countdown="98"/> 
        </lastDeparture> 
      </departures> 
    </line>
      </lines> 
    </monitor> 
    <trafficInfos/> 
    <message messageCode="1">ok</message> 
  </response> 
</ft>'; 

    query:"/ft/response/monitor/lines/line/departures/departure"

    XmlRole { name:"delay" ; query: "departureTime/@delay/number()" } 
    XmlRole { name:"countdown" ; query: "departureTime/@countdown/number()" } 


  }

  delegate: 
  Rectangle
  {
    color: "pink"; 
    width:parent.width; 
    height: col.height
  Column 
  {
    id: col 
    Text{ text: countdown } 
    Text{ text: delay } 
  }
  }

}// listView `