1

さて、次の .csv ファイルが含まれています。

AAC=1|1|1,AAK=1|2|8

そのファイルを次の .xml ファイルに書き込みたい:

<html>
  <A>
    <B>
      <C>
        <D>
          <TYPE>
            <NUMBER>7297</NUMBER>
            <DATA />
          </TYPE>
          <TYPE>
            <NUMBER>7721</NUMBER>
            <DATA>AAC=7|3|8,ABC=1|3|5,DAK=5|1|3,FFK=33</DATA>
          </TYPE>
        </D>
      </C>
    </B>
  </A>
</html>

具体的には 7721 の下の部分に書きたいので、更新された .xml ファイルは次のようになります。

<html>
  <A>
    <B>
      <C>
        <D>
          <TYPE>
            <NUMBER>7297</NUMBER>
            <DATA />
          </TYPE>
          <TYPE>
            <NUMBER>7721</NUMBER>
            <DATA>AAC=1|1|1,AAK=1|2|8,ABC=1|3|5,DAK=5|1|3,FFK=33</DATA>
          </TYPE>
        </D>
      </C>
    </B>
  </A>
</html>

キーが .csv と .xml の両方に既に存在する場合は、.xml ファイルの値のみが更新されますが、.csv ファイルのキーと値の両方が .xml ファイルに存在しない場合は、. xml ファイルに追加すると、それらのキーと値の両方が .xml ファイルに追加されます。

これまでの私のコード:

element = etree.fromstring(xmlData)

# Find all the TYPE with NUMBER=7721 and DATA
optype_nodes = element.xpath("//TYPE[NUMBER='7721' and DATA]")

for t in optype_nodes:
    d = t.find('DATA')
    d.text = 'csvdata'
print etree.tostring(element)

すべての .csv コンテンツをインポートし、.xml コンテンツを完全に置き換えました。

ありがとうございました!

4

3 に答える 3

1

まず、(csv または xml からの) 文字列の 1 つを辞書に変換する関数を書きましょう。

def string_to_dict(string):
    # Split the string on commas
    list_of_entries = string.split(',')
    # Each of these entries needs to be split on '='
    # We'll use a list comprehension
    list_of_split_entries = map(lambda e: e.split('='), list_of_entries)
    # Now we have a list of (key, value) pairs.  We can pass this
    # to the dict() function to get a dictionary out of this, and 
    # that's what we want to return
    return dict(list_of_split_entries)

次に、csv データと xml データの両方について、この辞書を取得します。

csv_dict = string_to_dict(csv_data)
# csv_dict = {'AAK': '1|2|8', 'AAC': '1|1|1'}
xml_dict = string_to_dict(d.text)
# xml_dict = {'ABC': '1|3|5', 'FFK': '33', 'AAC': '7|3|8', 'DAK': '5|1|3'}

update関数を使用して、csv_dict から xml_dict に値を追加し、同じ場所を上書きできます。

xml_dict.update(csv_dict)
# xml_dict = {'ABC': '1|3|5', 'FFK': '33', 'AAC': '1|1|1', 'AAK': '1|2|8', 'DAK': '5|1|3'}

ここでxml_dict、文字列に戻る必要があります。これを行う簡単な方法は次のとおりです。

# Let's get a list of key=value strings
list_of_items = ['%s=%s' % (k, v) for k, v in xml_dict.iteritems()]
# Now join those items together
new_xml_text = ','.join(list_of_items)
d.text = new_xml_text

それらをソートしたままにしたい場合は、次の方法で実行できます。

d.text = ','.join('%s=%s' % (k, xml_dict[k]) for k in sorted(xml_dict.keys()))
于 2012-07-27T16:50:57.503 に答える
0

これが可能かどうかはわかりません。つまり、質問に含めたxmlファイル構造にバインドされているかどうかです。構造を自由に選択できる場合は、XMLを利用して、次のようにデータを保存できます。

<TYPE>
   <NUMBER>7297</NUMBER>
   <DATA />
</TYPE>
<TYPE>
  <NUMBER>7721</NUMBER>
  <DATA>
    <AAC>1|1|1</AAC>
    <AAK>1|2|8</AAK>
    <ABC>1|3|5</ABC>
    <DAK>5|1|3</DAK>
  <DATA>
</TYPE>

このようにして、特定の値をより簡単に更新し、xpathを介してそれらにアクセスできます。取得したcsvStrをxml構造用に準備するには、split()を使用できます。

lst = csvStr.split(',')
for dataStr in lst:
    data = dataStr.split('=')
    #data[0]: var name, data[1]: var value

これが少し役立つことを願っています。

于 2012-07-27T16:38:45.913 に答える
0

だから、更新したかったd.text。これを行う方法の 1 つは、辞書に変換して更新し、d.text に書き戻すことです。書き戻すときは、csv に必要な順序が適切であることを確認してください。アルファベットだとわかります。そうであることを確認してください。辞書に変換してから更新しているため、順序が変わるリスクがあります。

def get_csv_dict(csv_line):

    return dict([(k,v) for k, v in map(lambda x: x.split('='), csv_line)])

contents = get_csv_dict(d.text)
required_contents = get_csv_dict(csvdata)
contents.update(required_contents)

それからする

>>> temp = []
>>> for key in sorted(contents.keys()):
...     temp.append(key + '=' + contents[key])
... 
>>> d.text = ",".join(temp)

必要に応じてd.text更新されます。

于 2012-07-27T16:47:06.083 に答える