2017-12-15 5 views
1

저는 파이썬에서 xml 파일을 구문 분석하기 위해 lxml을 사용하고 있습니다. xml에는 내 코드를 구성하는 용도가 있습니다. 약간 다른 여러 가지 구성을 사용해야하므로 xi:include 기능을 사용하고 있습니다.lxml 및 python : "글로벌"엔티티를 설정하는 방법

"기본"XML 파일에서 일부 항목을 선언하고 포함 된 항목에 대해 알릴 수 있다면 정말 유용 할 것입니다.

main.xml에 :

<?xml version="1.0"?> 
<!DOCTYPE doc> 
<configuration xmlns:xi="http://www.w3.org/2001/XInclude" name="foo" version="0.1" > 
<xi:include href="./external.xml" /> 
</configuration> 

external.xml :

<?xml version="1.0"?> 
<!DOCTYPE doc [ 
     <!ENTITY bar "example"> 
     ]> 
<objects> 
    <object name="&bar;" /> 
</objects> 

제가하고 싶은 것은 main.xml에 내부의 줄을 선언하는 것입니다 여기 내 작업 예입니다 , 이것을 할 수 있습니까? 사전에 감사합니다, 마테오

+0

나는 좋은 해결책을 생각할 수 없다. external.xml에서 엔티티 선언을 제거하면 포함되지 않습니다. 포함 된 문서는 포함되기 전에 구문 분석되며 확인되지 않은 엔터티 참조는 오류를 생성합니다. – mzjn

+0

안녕하세요 @ mzjn, 의견을 보내 주셔서 감사합니다. 해결 방법을 찾았습니다. 새로운 xml에서 모든 다른 구성을 수집하고 xpointer 기능을 통해 선택하는 가상의 노드를 래핑했습니다. 이것이 일반적인 관심사 일 수 있다면, 여기에 예제를 넣을 수 있습니다. –

+0

문제를 해결 한 해결책이 있다면 답으로 게시해야합니다. – mzjn

답변

0

이것은 내가 찾던 정확히 솔루션이 아니라 좀 내 문제 해결 :

main.xml에를

<?xml version="1.0"?> 
<!DOCTYPE doc> 
<configurations> 
    <configuration> 
    <xi:include href="./external/confs.xml" xpointer="xpointer(/ext/conf1)" /> 
    </configuration> 

    <configuration> 
    <xi:include href="./external/confs.xml" xpointer="xpointer(/ext/conf2)" /> 
    </configuration> 
</configurations> 

confs.xml

<?xml version="1.0"?> 
<!DOCTYPE doc[ 
    <!ENTITY foo "bar"> 
]> 
    <ext> 
     <conf1> 
      <inc name="apple_&foo;" /> 
     </conf1> 

     <conf2> 
      <inc name="orange_&foo;" /> 
     </conf2> 

    </ext>