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
使用R在XML文件中添加和更改节点_Xml_R_Xml Parsing_Openstreetmap - Fatal编程技术网

使用R在XML文件中添加和更改节点

使用R在XML文件中添加和更改节点,xml,r,xml-parsing,openstreetmap,Xml,R,Xml Parsing,Openstreetmap,我有一个XML(OSM)文件,如下所示(小示例): 到 到 或者获取所有 但是我不知道如何实际重写和添加我需要的部分。正如上面提到的, < P>,考虑到专门用来声明XML文档以满足最终用途需要的专用声明性编程语言。虽然R没有维护一个全面的XSLT处理器,但它可以与其他语言/软件(如Python和Excel)交互。即使对于后者,R也可以使用RDCOMClient库模拟Excel宏: XSLT脚本(另存为下面要使用的外部.xsl或.XSLT文件) R脚本(假设python是一个系统路径变量,则调用上

我有一个XML(OSM)文件,如下所示(小示例):

或者获取所有

<>但是我不知道如何实际重写和添加我需要的部分。正如上面提到的,

< P>,考虑到专门用来声明XML文档以满足最终用途需要的专用声明性编程语言。虽然R没有维护一个全面的XSLT处理器,但它可以与其他语言/软件(如Python和Excel)交互。即使对于后者,R也可以使用
RDCOMClient
库模拟Excel宏:

XSLT脚本(另存为下面要使用的外部.xsl或.XSLT文件)

R脚本(假设python是一个系统路径变量,则调用上述.py脚本)


或者,Excel可以运行XSLT,并使用R复制流程

Excel宏(使用对象,此处后期绑定)

R脚本(使用RDCOMClient复制上述内容)

最终XML输出

<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="CGImap 0.0.2">
  <node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" 
        uid="46882" visible="true" version="1" changeset="676636" 
        timestamp="2008-09-21T21:37:45Z"/>
  <way id="86015" version="1" timestamp="2016-02-26T15:01:32Z">
    <nd ref="85642"/>
    <nd ref="85641"/>
    <nd ref="86016"/>
    <nd ref="85642"/>
  </way>
  <relation id="1" version="1" timestamp="2016-02-26T15:01:32Z">
    <member type="way" ref="2" role="outer"/>
    <member type="way" ref="12" role="outer"/>
    <member type="way" ref="17" role="outer"/>
    <member type="way" ref="22" role="outer"/>
    <member type="way" ref="27" role="outer"/>
    <member type="way" ref="60" role="outer"/>
    <member type="way" ref="65" role="outer"/>
    <member type="way" ref="71" role="outer"/>
    <member type="way" ref="75" role="outer"/>
    <member type="way" ref="79" role="outer"/>
    <member type="way" ref="84" role="outer"/>
    <member type="way" ref="92" role="outer"/>
    <member type="way" ref="108" role="outer"/>
    <member type="way" ref="112" role="outer"/>
    <member type="way" ref="132" role="outer"/>
    <member type="way" ref="150" role="outer"/>
    <member type="way" ref="166" role="outer"/>
    <member type="way" ref="173" role="outer"/>
    <member type="way" ref="178" role="outer"/>
    <tag k="type" v="boundary"/>
    <tag k="city" v="00000 ExampleCity"/>
    <tag k="plz" v="00000"/>
    <tag k="boundary" v="postal_code"/>
  </relation>
</osm>


正确的标签方案应该是。没错。现在更正了。谢谢你的类XSLT问题!不幸的是,到目前为止,R还没有一个健壮、全面的XSLT库。但是,如果您有任何其他通用语言(Java、C#、Python、PHP、Perl,甚至Excel VBA),如Saxon和Xalan,甚至命令行Bash和PowerShell,R可以使用
system()
调用XSLT转换。请告知您有什么可用的。谢谢您的回答。我在回答问题时很灵活。我有Python和Excel可用。如果有好的教程,我也会为一个独立的程序解决方案打开。问题是,使用文本编辑器很容易就能解决,但我的文件“很大”(1GB)不会使所有非编程解决方案崩溃。谢谢您的回答,但应用代码时出现了一个小问题,它将
减少到
列表中有可能不更改该部分?好的,我想弄清楚,只是缺少了一个“/”。当将:
更改为
时,它工作正常。再次感谢你帮了我大忙!哎呀!错过了那部分。请参见在关系模板中添加
以复制其属性的编辑位置。很高兴它起到了作用,我希望您能加入XSLT粉丝俱乐部!请接受答案,不仅为您确认决议,也为未来的读者确认决议。
<tag k="type" v="multipolygon"/>
<tag k="type" v="boundary"/>
<tag k='boundary' v='postal_code' />
<tag k="note" v="00000 ExampleCity"/>
<tag k="city" v="00000 ExampleCity"/>
getNodeSet(doc,"//relation")
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<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>

  <!-- CHANGE @v ATTRIBUTE -->
  <xsl:template match="tag[@k='type']">
    <xsl:copy>      
      <xsl:copy-of select="@k"/>
      <xsl:attribute name="v">boundary</xsl:attribute>
    </xsl:copy>
  </xsl:template>

  <!-- CHANGE @k ATTRIBUTE -->
  <xsl:template match="tag[@k='note']">
    <xsl:copy>      
      <xsl:attribute name="k">city</xsl:attribute>
      <xsl:copy-of select="@v"/>
    </xsl:copy>
  </xsl:template>

  <!-- ADD NODE -->
  <xsl:template match="relation">
    <xsl:copy>      
      <xsl:apply-templates select="@*"/>
      <xsl:apply-templates select="member"/>
      <xsl:apply-templates select="tag"/>
      <tag k='boundary' v='postal_code' />
    </xsl:copy>
  </xsl:template>      
</xsl:transform>
import lxml.etree as ET

# LOAD ORIGINAL XML AND XSLT SCRIPT
dom = ET.parse('Input.xml')
xslt = ET.parse('XSLTScript.xsl')

# TRANSFORM XML INTO A NEW DOM OBJECT
transform = ET.XSLT(xslt)
newdom = transform(dom)

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

# OUTPUT TO FILE
xmlfile = open('Output.xml'),'wb')
xmlfile.write(tree_out)
xmlfile.close()
system('python "C:\\Path\\To\\Python\\Script.py"')
Public Sub RunXSLT()
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object

    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    Set xslDoc = CreateObject("MSXML2.DOMDocument")
    Set newDoc = CreateObject("MSXML2.DOMDocument")

    xmlDoc.Load "C\Path\To\Input.xml"
    xmlDoc.async = False

    xslDoc.Load "C\Path\To\XSLTScript.xsl"
    xslDoc.async = False
    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "C\Path\To\Output.xml"

    Set newDoc = Nothing
    Set xslDoc = Nothing
    Set xmlDoc = Nothing

End Sub
library(RDCOMClient)

xmlfile = COMCreate("MSXML2.DOMDocument")
xslfile = COMCreate("MSXML2.DOMDocument")
newxmlfile = COMCreate("MSXML2.DOMDocument")

xmlstr = 'C\\Path\\To\\Input.xml'
xslstr = 'C\\Path\\To\\XSLTScript.xsl'
newxmlstr = 'C\\Path\\To\\Output.xml'

# LOADING XML & XSLT FILES
xmlfile.async = FALSE
xmlfile$Load(xmlstr)

xslfile.async = FALSE
xslfile$Load(xslstr)

# TRANSFORMING XML FILE USING XLST INTO NEW FILE
xmlfile$transformNodeToObject(xslfile, newxmlfile)
newxmlfile$Save(newxmlstr)
<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="CGImap 0.0.2">
  <node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" 
        uid="46882" visible="true" version="1" changeset="676636" 
        timestamp="2008-09-21T21:37:45Z"/>
  <way id="86015" version="1" timestamp="2016-02-26T15:01:32Z">
    <nd ref="85642"/>
    <nd ref="85641"/>
    <nd ref="86016"/>
    <nd ref="85642"/>
  </way>
  <relation id="1" version="1" timestamp="2016-02-26T15:01:32Z">
    <member type="way" ref="2" role="outer"/>
    <member type="way" ref="12" role="outer"/>
    <member type="way" ref="17" role="outer"/>
    <member type="way" ref="22" role="outer"/>
    <member type="way" ref="27" role="outer"/>
    <member type="way" ref="60" role="outer"/>
    <member type="way" ref="65" role="outer"/>
    <member type="way" ref="71" role="outer"/>
    <member type="way" ref="75" role="outer"/>
    <member type="way" ref="79" role="outer"/>
    <member type="way" ref="84" role="outer"/>
    <member type="way" ref="92" role="outer"/>
    <member type="way" ref="108" role="outer"/>
    <member type="way" ref="112" role="outer"/>
    <member type="way" ref="132" role="outer"/>
    <member type="way" ref="150" role="outer"/>
    <member type="way" ref="166" role="outer"/>
    <member type="way" ref="173" role="outer"/>
    <member type="way" ref="178" role="outer"/>
    <tag k="type" v="boundary"/>
    <tag k="city" v="00000 ExampleCity"/>
    <tag k="plz" v="00000"/>
    <tag k="boundary" v="postal_code"/>
  </relation>
</osm>