2014-10-18 25 views
1

我想保留xml樣式表。但它不起作用。 我使用Python來自動修改用於部署hadoop的XML。如何保留xml樣式表?

XML:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

<!-- Put site-specific property overrides in this file. --> 

<configuration> 
    <property> 
    <name>fs.default.name</name> 
    <value>hdfs://c11:9000</value> 
  </property> 
</configuration> 

代碼:

from xml.etree.ElementTree import ElementTree as ET 

def modify_core_site(namenode_hostname): 
    tree = ET() 
    tree.parse("pkg/core-site.xml") 
    root = tree.getroot() 
    for p in root.iter("property"): 
     name = p.find("name").text 
     if name == "fs.default.name": 
      text = "hdfs://%s:9000" % namenode_hostname 
      p.find("value").text = text 
    tree.write("pkg/tmp.xml", encoding="utf-8", xml_declaration=True) 

modify_core_site("c80") 

結果:

<?xml version='1.0' encoding='utf-8'?> 
<configuration> 
    <property> 
    <name>fs.default.name</name> 
    <value>hdfs://c80:9000</value> 
  </property> 
</configuration> 

xml樣式表的消失...... 我怎能這樣?

回答

1

一個解決方案是你可以使用lxml一旦你解析XML直到你找到xsl節點。快速示例如下:

>>> import lxml.etree 
>>> doc = lxml.etree.parse('C:/downloads/xmltest.xml') 
>>> root = doc.getroot() 
>>> xslnode=root.getprevious().getprevious() 
>>> xslnode 
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> 

請確保您進行了一些異常處理並檢查節點是否確實存在。你可以查看節點是否是xslt處理指令的

>>> isinstance(xslnode, lxml.etree._XSLTProcessingInstruction) 
True 
相關問題