XML 파일을 다른 XML 파일로 가져올 수 있습니까?
XML 경로를 매개 변수로 사용하고 XML (경로가 제공됨)을 가져 오는 가져 오기 태그가 XML에 있음을 의미합니다.
답변:
다음과 같이 엔티티를 선언합니다.
<!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>
도움이 될만한 몇 가지 참고 자료 :
XMLResolver속성이 무엇 으로 설정되어 있는지 확인해야 할 수 있습니다 . XMLResolver 속성이 XMLDocument 개체에 설정되어 있지 않으면 외부 리소스를로드하지 못할 수 있습니다. msdn.microsoft.com/en-us/library/5fcwybb2.aspx
다른 답변은 가장 일반적인 두 가지 접근 방식 인 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>
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>