Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
用于更改.tcx文件(XML)中属性值的Python脚本_Python_Xml - Fatal编程技术网

用于更改.tcx文件(XML)中属性值的Python脚本

用于更改.tcx文件(XML)中属性值的Python脚本,python,xml,Python,Xml,我有一个.tcx(XML)文件,其模式如下: <Activities> <Activity> <Lap StartTime="2015-12-24T08:12:18.969Z"> <TotalTimeSeconds>4069.0</TotalTimeSeconds> <DistanceMeters>30458.794921875</DistanceMeters> <MaximumSpeed>43.36

我有一个.tcx(XML)文件,其模式如下:

<Activities>
<Activity>
<Lap StartTime="2015-12-24T08:12:18.969Z">
<TotalTimeSeconds>4069.0</TotalTimeSeconds>
<DistanceMeters>30458.794921875</DistanceMeters>
<MaximumSpeed>43.36123275756836</MaximumSpeed>
<Calories>2286</Calories>
<AverageHeartRateBpm><Value>144</Value></AverageHeartRateBpm><MaximumHeartRateBpm><Value>169</Value></MaximumHeartRateBpm>
<Intensity>Active</Intensity>
<Cadence>87</Cadence>
<TriggerMethod>Manual</TriggerMethod>

<Track>
    <Trackpoint>
        <Time>2015-12-24T08:12:19.969Z</Time>
        <Position><LatitudeDegrees>45.4917</LatitudeDegrees><LongitudeDegrees>9.16198</LongitudeDegrees></Position>
        <AltitudeMeters>124.018</AltitudeMeters>
        <DistanceMeters>0.0</DistanceMeters>
        <SensorState>Present</SensorState>
        <Extensions><TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2"><Watts>0</Watts></TPX></Extensions></Trackpoint>


...
</Track>
</Lap>
</Activity>
</Activities>

4069
30458.794921875
43.36123275756836
2286
144169
活跃的
87
手册
2015-12-24T08:12:19.969Z
45.49179.16198
124.018
0
目前
0
...
并且需要更改(加倍)瓦特属性。
想要一个简单的python脚本

您的最后两个元素标记需要是结束标记,并且您有一个Watts元素而不是属性。下面是如何处理文件结构

Python为此提供了ElementTree库。以下脚本将完成您想要的操作:

import xml.etree.ElementTree as ET

tree = ET.parse("test.tcx")

tpxns = "http://www.garmin.com/xmlschemas/ActivityExtension/v2"
for watts in tree.iter("{%s}Watts"%tpxns):
    watts.text = str(2*int(watts.text))

tree.write("testnew.tcx")
在这里,我导入ElementTree库并为其使用一个更简单的名称。parse函数从文件中创建ElementTree对象。我遍历该文件以查找所有Watts元素(因为这些元素出现在名称空间中,我实际上需要查找{}Watts,我使用字符串格式构建了它)

当我找到这样一个元素时,我将内部文本设置为前一个值的两倍(先转换为int,然后再转换回字符串)

最后,我编写了新的xml文件。如果我愿意,我可以在这里重写原始文件


如果您需要做一些更有趣的事情,请查看ElementTree模块的文档。它为使用XML提供了非常强大的工具。如果您需要更多功能(例如,我喜欢lxml),那么还有更强大的库。

只需运行一个XSLT脚本。不需要Python循环或昂贵的XPath(
/
)。作为信息,是一种声明性的、专用的编程语言,专门用于根据各种最终用途的需要重新构造、重新设计或重新格式化XML文档。与大多数通用语言(如Java、C#、Perl、PHP、VB)一样,Python在其lxml模块中配备了XSLT1.0处理器

下面运行标识转换以按原样复制整个文档,然后将任何Watts节点中的当前值乘以2。我在XSLT中声明一个命名空间
doc
,以引用Watts元素

XSLT(另存为.xsl或.XSLT)


谢谢,这正是我的目标。我尝试使用ElementTree库,但无法搜索Watts元素,因为我缺少名称空间概念。
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
               xmlns:doc="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="doc:Watts">
    <xsl:copy>
      <xsl:value-of select=". * 2"/>
    </xsl:copy>
  </xsl:template>

</xsl:transform>
import lxml.etree as ET

dom = ET.parse('Input.xml')
xslt = ET.parse('XSLTScript.xsl')

transform = ET.XSLT(xslt)
newdom = transform(dom)

tree_out = ET.tostring(newdom, encoding='UTF-8', pretty_print=True,  xml_declaration=True)

xmlfile = open('Output.xml')
xmlfile.write(tree_out)
xmlfile.close()