我正在嘗試決議下面的 XML 并閱讀其內容。XML in 是位元組。所有 XPath 查詢都回傳空。
<?xml version="1.0" encoding="UTF-8"?>
<Invoice
xmlns="urn:eslog:2.00"
xmlns:in="http://uri.etsi.org/01903/v1.1.1#"
xmlns:io="http://www.w3.org/2000/09/xmldsig#"
xmlns:xs4xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:eslog:2.00 eSLOG20_INVOIC_v200.xsd">
<M_INVOIC Id="data">
<S_UNH>
<D_0062>1889</D_0062>
<C_S009>
<D_0065>INVOIC</D_0065>
<D_0052>D</D_0052>
<D_0054>01B</D_0054>
<D_0051>UN</D_0051>
</C_S009>
</S_UNH>
<S_BGM>
<C_C002>
<D_1001>380</D_1001>
</C_C002>
<C_C106>
<D_1004>1889</D_1004>
</C_C106>
</S_BGM>
</M_INVOIC>
</Invoice>
下面是我在評論中嘗試輸出的代碼。.fromstring()似乎作業,因為它回傳一些東西,但 XPath 查詢回傳空串列。非常感謝您的幫助。
def load(self, file):
# print(file) # b'<?xml version="1.0" ...
# print(type(file)) # <class 'bytes'>
root = etree.parse(BytesIO(file))
# print(root.tag) # Returns: object has no attribute 'tag'
print(root.xpath('/Invoice')) # Returns: []
# print(root.nsmap) # object has no attribute 'nsmap'
root = etree.fromstring(file)
print(root.tag) # {urn:eslog:2.00}Invoice
# print(root.xpath('/Invoice')) # []
# print(root.xpath('/{urn:eslog:2.00}Invoice')) # Invalid expression
print(root.nsmap) # {None: 'urn:eslog:2.00', 'in': ...
print(root.xpath('/Invoce/M_INVOIC', nsmap = root.nsmap[None])) # [] for all dict keys
ns = { # a copy of root.nsmap
'None': 'urn:eslog:2.00',
'in': 'http://uri.etsi.org/01903/v1.1.1#',
'io': 'http://www.w3.org/2000/09/xmldsig#',
'xs4xs': 'http://www.w3.org/2001/XMLSchema',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance'}
print(root.xpath('/Invoice/M_INVOIC/S_BGM/C_C106/D_1004', namespaces=ns)) # empty []
print(root.xpath('/in:Invoice/M_INVOIC/S_BGM/C_C106/D_1004', namespaces=ns)) # empty []
print(root.xpath('/io:Invoice/M_INVOIC/S_BGM/C_C106/D_1004', namespaces=ns)) # empty []
print(root.xpath('/xs4xs:Invoice/M_INVOIC/S_BGM/C_C106/D_1004', namespaces=ns)) # empty []
print(root.xpath('/xsi:Invoice/M_INVOIC/S_BGM/C_C106/D_1004', namespaces=ns)) # empty []
uj5u.com熱心網友回復:
XML 檔案中元素的名稱都屬于名稱為 的名稱空間urn:eslog:2.00。那是因為該命名空間被宣告為“默認”命名空間(即沒有前綴),并且沒有一個元素名稱使用前綴。
除了urn:eslog:2.00命名空間之外,還有其他 3 個命名空間 URI 系結到前綴in、、io和xs4xs
xs前綴僅在xsi:schemaLocation根元素的屬性中使用,但沒有任何 XPath 運算式參考該屬性。
因此,在ns定義名稱空間前綴和 URI 系結的名稱空間映射中,我認為您只需要宣告一個名稱空間(即urn:eslog:2.00名稱空間),然后在 XPath 運算式中使用與該 URI 關聯的前綴。
目前,您已將該命名空間 URI 系結到 prefix None,但您的 XPath 不在None它命名的任何元素中使用該前綴。我認為如果您更改了 XPath 以使用該前綴,那么它們應該可以作業,例如
/None:Invoice/None:M_INVOIC/None:S_BGM/None:C_C106/None:D_1004
當然前綴比Noneeg更好eslog,但是你選擇的前綴是任意的:重要的是命名空間 URI;您的 XPath 需要使用系結到該 URI 的前綴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/522332.html
