创建

时间:2018-01-31 14:48:46

标签: python xml namespaces

我正在使用lxml etree来创建xml或REST调用。我有命名空间的问题,因为如果没有正确配置我从服务器得到语法错误。 正如你在下面的两个例子中看到的那样,我应该得到例如ns1,ns2,ns4,ns5,但是xml会用ns15,ns16进行,但最后它有例如“”或“” - 我知道这解释了但是对于我的REST调用的性质,我需要它作为例子。

我该如何阻止

我必须得到以下xml

<ns5:prenosPodatkovRazporedaZahtevaSporocilo xmlns="http://xxx.yyy/sheme/pdr/skupno/v1" xmlns:ns2="http://xxx.yyy/sheme/pdr/v1" xmlns:ns3="http://xxx.yyy/sheme/kis/skupno/v2" xmlns:ns4="http://xxx.yyy/sheme/kis/v2" xmlns:ns5="http://xxx.yyy/sheme/pdr/sporocila/v1">
<ns5:podatkiRazporeda>
    <ns2:podatkiRazporeda>
        <ns2:delitvenaEnota>
            <sifra>80</sifra>
        </ns2:delitvenaEnota>
        <ns2:vrstaRazporeda>
            <sifra>4</sifra>
        </ns2:vrstaRazporeda>
        <ns2:tipRazporeda>
            <sifra>D</sifra>
        </ns2:tipRazporeda>
        <ns2:obdobje>
            <ns2:mesec>12</ns2:mesec>
            <ns2:leto>2017</ns2:leto>
        </ns2:obdobje>
        <ns2:skupina>0</ns2:skupina>
        <ns2:izvor>P_738</ns2:izvor>
        <ns2:oznakeDelaZaDneve>
            <ns2:oznakaDelaZaDan>
                <ns2:dan>1</ns2:dan>
                <ns2:oznakaDela>D4</ns2:oznakaDela>
            </ns2:oznakaDelaZaDan>
            ....
        </ns2:oznakeDelaZaDneve>
        <ns2:organizacijskaEnota>
            <sifra>738</sifra>
        </ns2:organizacijskaEnota>
        <ns2:zaposlenec>
            <ns4:osebnaStevilka>10357</ns4:osebnaStevilka>
        </ns2:zaposlenec>
    </ns2:podatkiRazporeda>
</ns5:podatkiRazporeda>

我在哪里获得这个xml。 注意命名空间标记。

    <ns0:prenosPodatkovRazporedaOdgovorSporocilo xmlns:ns="http://rccirc.si/sheme/pdr/skupno/v1" xmlns:ns2="http://rccirc.si/sheme/pdr/v1" xmlns:ns3="http://rccirc.si/sheme/kis/skupno/v2" xmlns:ns4="http://rccirc.si/sheme/kis/v2" xmlns:ns5="http://rccirc.si/sheme/pdr/sporocila/v1" xmlns:ns0="ns5">
<ns0:podatkiRazporeda>
<ns1:podatkiRazporeda xmlns:ns1="ns2">
      <ns1:vrstaRazporeda>
        <sifra>647</sifra>
      </ns1:vrstaRazporeda>
      <ns1:tipRazporeda>
        <sifra>D</sifra>
      </ns1:tipRazporeda>
      <ns1:obdobje>
        <ns1:mesec>1</ns1:mesec>
        <ns1:leto>2018</ns1:leto>
      </ns1:obdobje>
      <ns1:skupina>0</ns1:skupina>
      <ns1:izvor>0</ns1:izvor>
      <ns1:organizacijskaEnota>
        <sifra>250</sifra>
      </ns1:organizacijskaEnota>
      <ns6:delitvenaenota xmlns:ns6="ns3">
        <sifra>80</sifra>
      </ns6:delitvenaenota>
      <ns1:oznakeDelaZaDneve>
        <oznakeDelaZaDneve>
          <ns1:dan>29</ns1:dan>
          <ns1:oznakaDela>1930-0730</ns1:oznakaDela>
        </oznakeDelaZaDneve>
      </ns1:oznakeDelaZaDneve>
      <ns1:zaposlenec>
        <ns7:osebnaStevilka xmlns:ns7="ns4">Z1</ns7:osebnaStevilka>
      </ns1:zaposlenec>
    </ns1:podatkiRazporeda>
    .......
    <ns11:podatkiRazporeda xmlns:ns11="ns2">
      <ns11:vrstaRazporeda>
        <sifra>647</sifra>
      </ns11:vrstaRazporeda>
      <ns11:tipRazporeda>
        <sifra>D</sifra>
      </ns11:tipRazporeda>
      <ns11:obdobje>
        <ns11:mesec>1</ns11:mesec>
        <ns11:leto>2018</ns11:leto>
      </ns11:obdobje>
      <ns11:skupina>0</ns11:skupina>
      <ns11:izvor>0</ns11:izvor>
      <ns11:organizacijskaEnota>
        <sifra>250</sifra>
      </ns11:organizacijskaEnota>
      <ns12:delitvenaenota xmlns:ns12="ns3">
        <sifra>80</sifra>
      </ns12:delitvenaenota>
      <ns11:oznakeDelaZaDneve>
        <oznakeDelaZaDneve>
          <ns11:dan>3</ns11:dan>
          <ns11:oznakaDela>0730-1530</ns11:oznakaDela>
        </oznakeDelaZaDneve>
        .....
      </ns11:oznakeDelaZaDneve>
      <ns11:zaposlenec>
        <ns13:osebnaStevilka xmlns:ns13="ns4">Z1</ns13:osebnaStevilka>
      </ns11:zaposlenec>
    </ns11:podatkiRazporeda>
</ns0:podatkiRazporeda>
</ns0:prenosPodatkovRazporedaOdgovorSporocilo>   

这是我的代码。

root = etree.Element('{ns5}prenosPodatkovRazporedaOdgovorSporocilo', nsmap = {'ns': "http://xxx.yyy/sheme/pdr/skupno/v1",'ns2':"http://xxx.yyy/sheme/pdr/v1"                                                                             ns3':"http://xxx.yyy/sheme/kis/skupno/v2",ns4': "http://xxx.yyy/sheme/kis/v2",ns5': "http://xxx.yyy/sheme/pdr/sporocila/v1"})

podatkiRazporedaMain = etree.SubElement(root, '{ns5}podatkiRazporeda')

#follwed通过创建子元素等。

 for rec in grouped_workers:
        podatkiRazporeda = etree.SubElement(podatkiRazporedaMain, '{ns2}podatkiRazporeda')
        vrstaRazporeda= etree.SubElement(podatkiRazporeda, '{ns2}vrstaRazporeda')
        vrstaRazporedaSifra = etree.SubElement(vrstaRazporeda, 'sifra')
        vrstaRazporedaSifra.text = "647"
        tipRazporeda= etree.SubElement(podatkiRazporeda, '{ns2}tipRazporeda')
        tipRazporedaSifra = etree.SubElement(tipRazporeda, 'sifra')
        tipRazporedaSifra.text = 'D'

        for rr in rec["data"]:
            oznakaDelaZaDan = etree.SubElement(oznakeDelaZaDneve, 'oznakeDelaZaDneve')
            dan= etree.SubElement(oznakaDelaZaDan, '{ns2}dan')
            dan.text = str(rr["rw_date"].day)
            oznakaDela = etree.SubElement(oznakaDelaZaDan, '{ns2}oznakaDela')
            oznakaDela.text = str(rr["rw_shift"])

    #print etree.tostring(root, pretty_print=True, xml_declaration=False, encoding='UTF-8')

fle = os.path.join(request.folder, 'private', str(647) + '.xml')
with open(fle, 'wb') as f:
        f.write(etree.tostring(root, pretty_print=True, xml_declaration=False, encoding='UTF-8'))#,inclusive_ns_prefixes=None))
        #etree..write(fle, pretty_print=True, xml_declaration=False, encoding='UTF-8')
print "Done"

那么为什么ns会增加? 希望我很清楚

比你

1 个答案:

答案 0 :(得分:0)

因此,当你创建标签时,你不应该写

vrstaRazporeda= etree.SubElement(podatkiRazporeda, '{ns2}vrstaRazporeda')
vrstaRazporedaSifra = etree.SubElement(vrstaRazporeda, 'sifra').text = "647"

但是

  vrstaRazporeda= etree.SubElement(podatkiRazporeda, '{http://xxx.yyy/sheme/pdr/v1}vrstaRazporeda')
vrstaRazporedaSifra = etree.SubElement(vrstaRazporeda, 'sifra').text = "647"

所以整个网址 - 这似乎解决了这个问题。