2014-11-14 107 views
0

下面是一個XML的示例:調理的xpath,LXML

<w:p> 
    <w:r> 
     <w:rPr> 
     <w:b/> 
    <w:t> There was a rich girl </w:t> 
    </w:r> 
    <w:r> 
     <w:rPr> 
     <w:bCs/> 
    <w:t> Nananananan </w:t> 
    </w:r> 
    <w:r> 
     <w:rPr> 
     <w:b/> 
     <w:bCs/> 
    <w:t>If I had all the money in the world </w:t> 
    </w:r> 
</w:p> 

我希望文本"There was a rich girl Nanananan"要被提取,但"If i had all the money.." 我需要提取對應於文本要麼<w:b><w:bCs>標籤,但如果兩者都出現在一起,我需要跳過提取。

換句話說,僅在存在w:bCsw:b時提取文本。

我所做的是:

text2=" " 
w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'  
for r in p.xpath('.//w:t',namespaces={'w': w}): 
    if r.xpath('..//w:b|..//w:bCs[@w:val="0"]',namespaces={'w': w}): 
     text2 += r.text 

這只是檢查是否寬:B或寬:BCS存在(並匹配即使雙方都存在)。我如何添加排他性條件?

回答

1

'(..//w:b|..//w:bCs[@w:val="0"])[count(./..//w:b|./../w:bCs[@w:val="0"])=1]'

所以count(./..//w:b|./../w:bCs[@w:val="0"])=1false,如果有更多的則是在結果1個節點, 和[false]將使主序返回什麼。

編輯:首先,這是XML真的打破。 w:rPr的結束標籤在哪裏?二,w:valw:bCs標籤[@w:val="0"]沒有屬性。 仍然有可能實現你想要的:

for r in p.xpath('.//w:t[./ancestor::w:r[count(.//w:b | .//w:bCs)=1]]',namespaces={'w': w}): 
    text2 += r.text 

編輯2:工作循環與val="0"附加條件和破碎的xml:

for r in p.xpath('.//w:t[./ancestor::w:r[(.//w:b or .//w:bCs[@w:val="0"]) and count(.//w:b|.//w:bCs)=1]]',namespaces={'w': w}): 
    text2 += r.text 
+0

嗨,我已經編輯我的問題有點。你可以看看,請..上述代碼似乎並沒有工作.. –

+0

嗨,看到更新的答案。 –

+0

謝謝你的工作..不能用這個表達式作爲上面的第一個?我想提取w:b或w:bCs [@w:val =「0」],如果w:b和w:bCs(不考慮val)一起出現,則不提取。我修改你的第一個表達式爲:'(..//w:b|..//w:bCs[@w:val="0"]ccount(./..//w:b|./。 ./w:bCs)=1])' 但它不起作用。爲什麼? –