2017-10-20 5 views
0

mzjnで提案されているように、私は全体の質問を変更して単純化しようとしています。Python lxml libraryには、空のタグにNoneが含まれています

私はこのXMLを持っている:

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">A list of things</span>: Element1, element2, element3, element4 element5.</p> 
    </body> 
</Element> 
</Content> 

私は "" リストの内容を変更し、交換したい "<、>"。そして、私はこのコードを持っている:

from lxml import etree as et 
def replace_commas(file): 
    parser = et.parse(str(file)) 
    root = parser.getroot() 
    xpath_expr = "//Element[starts-with(@Ref,'List_') \ 
or @GroupName='Lists']/descendant::*" 
    elements = root.xpath(xpath_expr) 
    for element in elements: 
     if element.text is not None or element.tail is not None: 
      text = str(element.text) 
      text = text.replace(',', '<,>') 
      tail = str(element.tail) 
      tail = tail.replace(',','<,>') 
      element.text = text 
      element.tail = tail 
    tree = et.ElementTree(root) 
    tree.write(file, pretty_print=True) 

予想される出力は次のようになります。

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">A list of things</span>: Element1&lt;,&gt; element2&lt;,&gt; element3&lt;,&gt; element4 element5.</p> 
    </body> 
</Element> 
</Content> 

私の結果はしかし:

<Content Version="1.0" Name="Cont"> 
<Element Ref="Text_4158" ElementType="ItISSomething" GroupName="Some_Content"> 
    <body> 
    <p>Some content is here.</p> 
    </body> 
</Element> 
<Element Ref="List_585" ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p>None<span class="bold">A list of things</span>: Element1&lt;,&gt; element2&lt;,&gt; element3&lt;,&gt; element4 element5.</p> 
    </body> 
</Element> 
</Content> 

タグ "P" と「スパンの間にどれを取得しません"何もないはずです。なにが問題ですか?

質問に対するこのアップデートがクエリを理解し、解決策を見つけるのに役立ちます。

更新: def replace_commas(file):のコロンを修正し、et.ElementTree(root)の字下げを修正しました。

また、mzjnで提案されている解決策でエラーが発生している箇所が見つかりました。それは価値なしとなるよう、私は重要な要素の尾部にNoneTypeを取得し、この素子では

<Element Ref="List_222"ElementType="ListElements" GroupName="Lists"> 
    <body> 
    <p><span class="bold">List: <span class="italic">Important elements</span></span>: El1 (prop1), el2 (prop2), el3 (prop3); with a special property.</p> 
    </body> 
</Element> 

:私は私のXMLでこの要素を持っています。

私はそれを解決する方法を見ていません。

+0

あなたは望ましいケースを追加できますか? – Jonathan

+0

私は望ましい事例を追加しました。それはNone値なしの空要素になります。私は原因についての私の小さな研究についていくつかの情報を追加しました。しかし、私は何も見つかりませんでした。 – TMikonos

+0

質問を簡略化して[mcve]を作成してください。 – mzjn

答えて

1

要素のtextプロパティが空の場合(値を持たない場合)は、組み込み定数Noneを返します。

第2の<p>要素のtextプロパティは空です。しかし、text = str(element.text)を使用すると、text変数が文字列'None'と等しくなります。それが出力に表示されます。

あなたは、各要素に対して個別にtexttailをチェックすると、それが動作するはずです:

for element in elements: 
    if element.text is not None: 
     element.text = element.text.replace(',', '<,>') 
    if element.tail is not None: 
     element.tail = element.tail.replace(',', '<,>') 
+0

elementTypeオブジェクトにエラーがあります.NothingTypeオブジェクトには属性の置換がありません。 – TMikonos

+0

'if element.tail is None:'のポイントは、このようなエラーを防ぐためです。なぜあなたはそのエラーを得るのか説明できません。より多くの情報を提供する必要があります。 – mzjn

+0

空の要素を返す:

。それは非常に奇妙です。私はどこがもっと見えるのかわかりません。 – TMikonos

0

は見た後、私は空の尾の解決策をついに発見しました。代わりに、要素が空でなかったかどうかをチェックするのは、私がNoneの場合、それはチェックを解決し何もしなかった、それは続ける:

for element in elements: 
    if element.text is None: 
     continue 
    else: 
     element.text = element.text.replace(',','<,>') 
    if element.tail is None: 
     continue 
    else: 
     element.tail = element.tail.replace(',','<,>') 
    tree = et.ElementTree(root) 
    tree.write(args.file, pretty_print=True) 

この修正により、私は問題を解決することができた程度です。

関連する問題