XML 파일을 다른 XML 파일로 가져올 수 있습니까?


83

XML 파일을 다른 XML 파일로 가져올 수 있습니까?

XML 경로를 매개 변수로 사용하고 XML (경로가 제공됨)을 가져 오는 가져 오기 태그가 XML에 있음을 의미합니다.

답변:


93

외부 (파싱 된) 일반 엔티티를 사용할 수 있습니다 .

다음과 같이 엔티티를 선언합니다.

<!ENTITY otherFile SYSTEM "otherFile.xml">

그런 다음 다음과 같이 참조합니다.

&otherFile;

완전한 예 :

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE doc [
<!ENTITY otherFile SYSTEM "otherFile.xml">
]>
<doc>
  <foo>
    <bar>&otherFile;</bar>
  </foo>
</doc>

XML 파서가 파일을 읽을 때 엔티티 참조를 확장하고 참조 된 XML 파일을 콘텐츠의 일부로 포함합니다.

"otherFile.xml"에 다음이 포함 된 경우 : <baz>this is my content</baz>

그러면 XML은 다음과 같이 XML 파서에 의해 평가되고 "보여집니다".

<?xml version="1.0" standalone="no" ?>
<doc>
  <foo>
    <bar><baz>this is my content</baz></bar>
  </foo>
</doc>

도움이 될만한 몇 가지 참고 자료 :


1
안녕 Mads, 나는 이것에 갇혀있다 .IE에서 main.xml 파일을 볼 때 나는 내 otherFile.xml의 텍스트를 제대로 얻고 있지만 내 응용 프로그램에서 동일한 개념을 사용하고 XMLDocument에 내 XML을로드 할 때 발생합니다. .net의 경우 otherFile.xml의 텍스트를 얻지 못하고 대신 main.xml에 작성된 모든 <? xml version = "1.0"standalone = "no"?> <! DOCTYPE doc [<! ENTITY otherFile SYSTEM "otherFile.xml">]> <doc> <foo> <bar> & otherFile; </ bar> </ foo> </ doc> 파일을로드하기 위해 다른 작업을 수행해야하는 경우 xmldocument ???
Sumit

3
.NET API에 익숙하지 않습니다. 그러나 XMLResolver속성이 무엇 으로 설정되어 있는지 확인해야 할 수 있습니다 . XMLResolver 속성이 XMLDocument 개체에 설정되어 있지 않으면 외부 리소스를로드하지 못할 수 있습니다. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
Mads Hansen

1
크롬과 같은 브라우저는 이것을 이해합니까?
Alp 2013 년

3
브라우저는 로컬 파일에 대한 보안상의 이유로이 기능을 비활성화 할 수 있습니다. 크롬에 --allow-file-access-from-files 스위치를 사용하거나 호스트에 업로드
premek.v

1
.NET에서는 XmlReaderSettings에서 XmlResolver (기본 XmlUriResolver를 만들어) 및 ProhibitDTD (false)를 설정하여 과거 권한 문제를 가져옵니다. 기본적으로 Windows / .NET 보안 정책은 외부 리소스로드를 허용하지 않는 것 같습니다.
존 예수

26

다른 답변은 가장 일반적인 두 가지 접근 방식 인 Xinclude 및 XML 외부 엔터티를 다룹니다. Microsoft는 Xinclude를 선호해야하는 이유와 여러 예제 구현에 대한 훌륭한 글을 가지고 있습니다. 아래 비교를 인용했습니다.

http://msdn.microsoft.com/en-us/library/aa302291.aspx

왜 XInclude인가?

첫 번째 질문은 "XML 외부 엔티티 대신 XInclude를 사용하는 이유는 무엇입니까?"입니다. 그 대답은 XML 외부 엔터티가 여러 가지 잘 알려진 제한 사항과 불편한 의미를 가지고 있기 때문에 범용 포함 기능이되는 것을 효과적으로 방지한다는 것입니다. 구체적으로 특별히:

  • XML 외부 엔티티는 완전한 독립 XML 문서가 될 수 없습니다. 독립형 XML 선언이나 Doctype 선언은 허용되지 않습니다. 이는 사실상 XML 외부 엔티티 자체가 다른 외부 엔티티를 포함 할 수 없음을 의미합니다.
  • XML 외부 엔터티는 잘 구성된 XML이어야합니다 (첫눈에별로 나쁘지는 않지만 XML 문서에 샘플 C # 코드를 포함하고 싶다고 가정 해보십시오).
  • 외부 엔티티를로드하지 못하면 치명적 오류입니다. 모든 복구는 엄격히 금지됩니다.
  • 전체 외부 엔터티 만 포함될 수 있으며 문서의 일부만 포함 할 수있는 방법은 없습니다. -외부 엔티티는 DTD 또는 내부 서브 세트에서 선언되어야합니다. 이는 문서 요소가 Doctype 선언에 이름이 지정되어야하고 독자의 유효성을 검사하는 경우 문서의 전체 콘텐츠 모델이 DTD에 정의되어야한다는 사실과 같은 의미로 가득 찬 Pandora의 상자를 엽니 다.

XML 외부 엔터티를 포함 메커니즘으로 사용하는 데 대한 결함은 한동안 알려져 왔으며 실제로 1999 년에 Microsoft와 IBM에 의해 W3C에 XML 포함 제안이 제출되었습니다. 이 제안은 범용 XML 포함 기능에 대한 처리 모델과 구문을 정의했습니다.

4 년 후 Xinclude라고도하는 XML Inclusion 버전 1.0은 후보 권장 사항입니다. 즉, W3C는 광범위하게 검토되었으며 해결하기 위해 설정 한 기본 기술 문제를 충족한다고 믿지만 아직 해결되지 않았습니다. 전체 추천.

다양한 예제 구현을 제공하는 또 다른 좋은 사이트는 https://www.xml.com/pub/a/2002/07/31/xinclude.html 입니다. 다음은 해당 사이트의 일반적인 사용 사례입니다.

<book xmlns:xi="http://www.w3.org/2001/XInclude">

  <title>The Wit and Wisdom of George W. Bush</title>

  <xi:include href="malapropisms.xml"/>

  <xi:include href="mispronunciations.xml"/>

  <xi:include href="madeupwords.xml"/>

</book>

1
Xinclude와 XML 외부 엔터티를 비교 한 것으로, 둘 다 상위 2 개 답변이며 이미 사용 예제를 보여 주거나 제공합니다. 나는 그것이 토론에 추가되고 코멘트를하기에는 너무 길거나 복잡하다고 느꼈다. 마찬가지로 질문은 '어떻게'가 아닌 '할 수있다'를 묻는다. 그래서 일반화 된 질문에 답하는 한, 이것은 내가 실제로 질문의 의도라고 느꼈던 방향성을 명확히하는쪽으로 향한다. 특정 구현에 대한 다른 많은 좋은 참조. 즉, 피드백에 감사드립니다. 곧 예제로 업데이트하겠습니다.
VoteCoffee

예를 추가하여 문제를 해결해 주신 것에 대한 답변과 존경심에 감사 드리지만 답변은 여전히 ​​근본적으로 결함이있는 것 같습니다. 일반적으로 다른 곳에서 텍스트를 인용 할 때는 해당 텍스트를 인용구에 포함해야하며 (표절을 시도하지 않는 것이 분명해 지도록), 더 중요한 것은 인용문 위 / 아래에서 인용 한 이유를 매우 명확하게 설명하는 자체 토론을 제공해야합니다. 그 특정 텍스트와 그것이 질문에 답하는 데 어떻게 도움이되는지. 이 두 가지를 모두 수행하고 다시 댓글을 작성하면 (알림을 받도록) 기꺼이 내 댓글을 삭제하고 내 반대 투표를 철회합니다.
Dan Bechard

블록 시세 및 의견 업데이트
VoteCoffee

이것은 훨씬 더 나은 대답입니다! 더 이상 사실이 아닌 첫 번째 댓글을 찬성하고 삭제했습니다. 나는 맥락을 위해 다른 의견을 남기고 미래의 독자들이 더 나은 답변을 쓸 수 있도록 도울 것입니다.
Dan Bechard 2017 년

11

msdn.microsoft.com/en-us/library/aa302291.aspx로 시도 했지만 사용하지 않았습니다. (내 Xml은 main.xml <? xml version = "1.0"?> <Head> <xi : include href입니다. = "imported.xml"xmlns : xi = " w3.org/2003/XInclude" > </ Head> Imported.xml <? xml version = "1.0"?> <footer> © Contoso Corp, 2003 </ footer> 및 내가 얻은 최종 xml은 <? xml version = "1.0"?> <Head> <xi : include href = "imported.xml"xmlns : xi = " w3.org/2003/XInclude "/> </ Head> 내가 뭔가 잘못하고 있습니까?
Sumit

Java에서는 XInclude에 대한 지원이 명시 적으로 활성화되어야합니다. 도서관에 동일한 준비가 필요할까요?
Tomasz Nurkiewicz

.net을 사용하여 XMl을 구문 분석했습니다. Mads Solution으로 XML을 가져올 수있었습니다. 시간을 내 주셔서 감사합니다 ..
Sumit

1
libxml은 이것을 지원합니다.
RishiD 2013 년

1
Java의 경우 아래 줄을 추가해야합니다. DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance (); dbFactory.setXIncludeAware (true);
Rahul Sahu

1

Mads Hansen의 솔루션은 좋지만 .NET 4에서 외부 파일을 읽는 데 성공하려면 리졸버, ProhibitDTD 등에 대한 주석에서 힌트를 사용하는 데 시간이 걸렸습니다.

이것이 수행되는 방법입니다.

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.DtdProcessing = DtdProcessing.Parse;
        XmlUrlResolver resolver = new XmlUrlResolver();
        resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
        settings.XmlResolver = resolver;
        var reader = XmlReader.Create("logfile.xml", settings);
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        foreach (XmlElement element in doc.SelectNodes("//event"))
        {
            var ch = element.ChildNodes;
            var count = ch.Count;
        }

logfile.xml :

<?xml version="1.0"?>
<!DOCTYPE logfile [
<!ENTITY events    
 SYSTEM "events.txt">
]>
<logfile>
&events;
</logfile>

events.txt :

<event>
    <item1>item1</item1>
    <item2>item2</item2>
</event>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.