2014-11-21 81 views
0
I have the following piece of xml: 
     <w:p> 
      <w:r> 
       <w:rPr> 
        <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/> 
        <w:sz w:val="24"/> 
        <w:szCs w:val="24"/> 
        <w:lang w:val="en-US"/> 
       </w:rPr> 
       <w:fldChar w:fldCharType="begin"/> 
      </w:r> 
      <w:r> 
       <w:rPr> 
        <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/> 
        <w:sz w:val="24"/> 
        <w:szCs w:val="24"/> 
        <w:lang w:val="en-US"/> 
       </w:rPr> 
       <w:instrText xml:space="preserve"> ADDIN EN.CITE &lt;EndNote&gt;&lt;Cite&gt;&lt;Author&gt;Su&lt;/Author&gt;&lt;Year&gt;2010&lt;/Year&gt;&lt;RecNum&gt;130&lt;/RecNum&gt;toethanol/metabolism&lt;/keyword&gt;&lt;keyword&gt;Molecular Sequence Data&lt;/keyword&gt;&lt;keyword&gt;Mutagenesis, Insertional&lt;/keyword&gt;&lt;keyword&gt;Sequence Alignment&lt;/keyword&gt;&lt;keyword&gt;/genetics/*metabolism&lt;/keyword&gt;&lt;/keywords&gt;&lt;dates&gt;&lt/EndNote&gt;</w:instrText> 
      </w:r> 
      <w:r> 
       <w:rPr> 
        <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/> 
        <w:sz w:val="24"/> 
        <w:szCs w:val="24"/> 
        <w:lang w:val="en-US"/> 
       </w:rPr> 
       <w:fldChar w:fldCharType="separate"/> 
      </w:r> 
      <w:r> 
       <w:rPr> 
        <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/> 
        <w:sz w:val="24"/> 
        <w:szCs w:val="24"/> 
        <w:lang w:val="en-US"/> 
       </w:rPr> 
       <w:t>(ABCD et al. 2006)</w:t> 
      </w:r> 
      <w:r> 
       <w:rPr> 
        <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/> 
        <w:sz w:val="24"/> 
        <w:szCs w:val="24"/> 
        <w:lang w:val="en-US"/> 
       </w:rPr> 
       <w:fldChar w:fldCharType="end"/> 
      </w:r> 
     </w:p> 

我想要做的是,搜索w:fldChar與價值"begin",如果發現,將一個等級可達w:r和搜索w:instrText其中應包含文本「ADDIN EN.CITE」和如果這樣做,去一個級別爲w:再次R和提取包含在後面接下來的w:t標籤的文本..條件遍歷所有W¯¯,R兄妹

我嘗試以下,但它產生了什麼:

text = "" 
w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' 
for p in source.xpath('.//w:p',namespaces={'w':w}): 
     text+= " " 
     for q in p.xpath('.//w:fldChar[@w:fldCharType="begin"]',namespaces={'w':w}): #search for w:fldchar 
      for t in q.xpath('/../..//w:instrText[contains(text(),"ADDIN EN.CITE")]/..//w:r',namespaces={'w':w}): #check for addin en cite 
       for r in t.itersiblings(tag = '{'+w+'}r'): #iterate over siblings of w:r 
        if r.xpath('.//w:t',namespaces={'w':w}): #if w:t in the sibling , extract text and break.. 
         text+= r.text 
         break 

我會出錯?問題似乎與q.xpath聲明..

回答

0

這不是很難,但需要一些研究。經過搜索後,我可以使用以下方式提取文本:

w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main' 
for p in source.xpath('.//w:p//w:instrText[contains(text(),"ADDIN EN.CITE")]',namespaces={'w':w}): 
    text+= " " 
    for q in p.xpath('../following-sibling::w:r//w:t',namespaces = {'w':w}): 
     text+= q.text 
     break 

這很好。在兄弟之後迭代遍歷同一級別的各種運行實例。由於文本包含在第四次運行實例中,所以一旦我得到文本,我就會跳出循環。

0

一方面,XPath表達式中

for t in q.xpath('/../..//w:instrText...'...) 

沒有意義。初始的/表示「從根節點開始」(即最外層元素的父節點)。以下步驟..意味着「上下文節點的父節點」。但根節點沒有父節點。所以這個表達式不會選擇什麼(實際上,XPath 1.0中,/..作爲指定空節點集的便捷方式。)

相反,你可能想

for t in q.xpath('../..//w:instrText...'...) 

它首先考慮上下文節點的父(值爲t)。

因此,這將解決一個致命的問題。我不確定您的XPath是否正確,否則,因爲在描述他們應該做的事情時遇到困難。

+0

我想在第3個w:r標籤中提取文本。但在此之前,我需要檢查第二個運行標記是否帶有文本插件引用的w:instrtext。如果有,然後提取文本,否則不。.. – 2014-11-21 03:12:12

+0

如何使用「下面的兄弟姐妹」,而不是?如[鏈接](http://www.w3schools.com/xpath/xpath_axes.asp)中所述。我仍然面臨着它的問題..只需要提取任何兄弟姐妹下的第一個文本,然後打破.. – 2014-11-21 04:52:37

+0

@Swordy:你的要求仍然不清楚。在你原來的問題中,你說你想從w:t元素中提取文本。但是在這裏你說你想在第三個w:r元素中提取文本,它沒有w:t子。我很困惑。 – LarsH 2014-11-21 16:56:00