簡體   English   中英

在 Python 中從 XML 文件中提取注釋

[英]Extracting comments from XML file in Python

我想提取 XML 文件的注釋部分。 我想提取的信息在標簽之間找到,然后在“示例”的文本標簽中找到。

XML 文件的結構如下所示。

<Boxes>

  <Box Id="3" ZIndex="13">
      <Shape>Rectangle</Shape>
      <Brush Id="0" />
      <Pen>
        <Color>#FF000000</Color>

      </Pen>
      <Tag>&lt;?xml version="1.0"?&gt;
&lt;PFDComment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;Text&gt;**EXAMPLE** &lt;/Text&gt;

&lt;/PFDComment&gt;</Tag>
  </Box>

</Boxes>

我在下面嘗試了一些東西,但無法獲得我想要的信息。

def read_cooments(xml):
    tree = lxml.etree.parse(xml)

    Comments= {}
    for comment in tree.xpath("//Boxes/Box"):
    #                                
        get_id = comment.attrib['Id']
        Comments[get_id] = []
        for group in comment.xpath(".//Tag"):
        #                        
            Comments[get_id].append(group.text)

    df_name1 = pd.DataFrame(dict([(k,pd.Series(v)) for k,v in Comments.items()]))  

任何人都可以幫助從上面顯示的 XML 文件中提取注釋嗎? 任何幫助表示贊賞!

使用下面給出的代碼:

def read_comments(xml):
    tree = etree.parse(xml)
    rows= []
    for box in tree.xpath('Box'):
        id = box.attrib['Id']
        tagTxt = box.findtext('Tag')
        if tagTxt is None:
            continue
        txtNode = etree.XML(tagTxt).find('Text')
        if txtNode is None:
            continue
        rows.append([id, txtNode.text.strip()])
    return pd.DataFrame(rows, columns=['id', 'Comment'])

請注意,如果您在函數內創建 DataFrame,則它是該函數的局部變量,從外部是不可見的。 一個更好、更易讀的方法(就像我所做的那樣)是該函數返回這個 DataFrame。

Box元素不包含Tag子元素或Tag不包含任何Text子元素時,此函數還在 2 個地方包含continue以防止可能的“錯誤情況”。

我還注意到沒有必要替換&lt; &gt; <>用我自己的代碼,因為lxml自己執行它。

編輯

我的測試如下:開始表單導入:

import pandas as pd
from lxml import etree

我使用了一個包含以下內容的文件:

<Boxes>
  <Box Id="3" ZIndex="13">
    <Shape>Rectangle</Shape>
    <Brush Id="0" />
    <Pen>
      <Color>#FF000000</Color>
    </Pen>
    <Tag>&lt;?xml version="1.0"?&gt;
&lt;PFDComment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
  &lt;Text&gt;**EXAMPLE** &lt;/Text&gt;
&lt;/PFDComment&gt;</Tag>
  </Box>
</Boxes>

我調用了上面的函數:

df_name1 = read_comments('Boxes.xml')

當我打印df_name1 時,我得到:

  id      Comment
0  3  **EXAMPLE**

如果出現問題,請使用上述函數的“擴展”版本,並帶有測試打印輸出:

def read_comments(xml):
    tree = etree.parse(xml)
    rows= []
    for box in tree.xpath('Box'):
        id = box.attrib['Id']
        tagTxt = box.findtext('Tag')
        if tagTxt is None:
            print('No Tag element')
            continue
        txtNode = etree.XML(tagTxt).find('Text')
        if txtNode is None:
            print('No Text element')
            continue
        txt = txtNode.text.strip()
        print(f'{id}: {txt}')
        rows.append([id, txt])
    return pd.DataFrame(rows, columns=['id', 'Comment'])

並查看打印輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM