.NET의 XMLDocument의 출력에서 빈 XMLNS 속성을 방지하는 방법은 무엇입니까?
-
02-07-2019 - |
문제
.NET에서 XMLDocument에서 XML을 생성 할 때 공백 xmlns
속성은 요소가 처음으로 나타납니다 없이 관련 네임 스페이스가 삽입됩니다. 이것이 어떻게 방지 할 수 있습니까?
예시:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
산출:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
원한다 산출:
<root xmlns="whatever:name-space-1.0"><loner /></root>
적용 가능한 솔루션이 있습니까? XmlDocument
코드, 발생하는 것이 아닙니다 ~ 후에 문서를 문자열로 변환합니다 OuterXml
?
이를 수행 한 이유는 XMLDocument-GENERATED XML을 사용하여 특정 프로토콜의 표준 XML과 일치 할 수 있는지 확인하는 것입니다. 블랭크 xmlns
기인하다 5월 파서를 깨거나 혼동하지는 않지만이 프로토콜에서 본 어떤 사용에도 존재하지 않습니다.
해결책
Jeremy Lew의 답변과 조금 더 많은 연주 덕분에 공백을 제거하는 방법을 알아 냈습니다. xmlns
속성 : 원하는 하위 노드를 만들 때 루트 노드 네임 스페이스를 전달합니다. ~ 아니다 접두사가 켜져 있습니다. 루트에 접두사가없는 네임 스페이스를 사용하여 자식 요소에서 동일한 네임 스페이스를 사용해야한다는 의미입니다. 또한 접두사가 없습니다.
고정 코드 :
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0"));
Console.WriteLine(xml.OuterXml);
올바른 방향으로 나를 인도 한 모든 답변에 모두 감사합니다!
다른 팁
이것은 Jenit의 답변의 변형입니다 (매우 감사합니다 BTW!)
XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);
이렇게하면 네임 스페이스를 어디에서나 복사하거나 반복해야합니다.
만약 <loner>
샘플 XML의 요소에는 없습니다 xmlns
기본 네임 스페이스 선언은 whatever:name-space-1.0
네임 스페이스가 아닌 네임 스페이스. 그것이 당신이 원하는 것이라면, 당신은 그 네임 스페이스에서 요소를 만들어야합니다.
xml.CreateElement("loner", "whatever:name-space-1.0")
당신이 원한다면 <loner>
네임 스페이스가없는 요소, 생성 된 XML은 정확히 필요한 것입니다. xmlns
자동으로 추가 된 속성.
루트는 회색되지 않은 네임 스페이스에 있으므로, 이름이없는 뿌리의 자식은 예와 같이 출력되어야합니다. 솔루션은 다음과 같은 루트 요소를 접두사하는 것입니다.
<w:root xmlns:w="whatever:name-space-1.0">
<loner/>
</w:root>
암호:
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);
가능하면 직렬화 클래스를 작성 한 다음 다음을 수행하십시오.
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);
더 안전하며 더 많은 제어가 필요한 경우 속성으로 네임 스페이스를 제어 할 수 있습니다.
공장 패턴을 사용하여 문제를 해결했습니다. Xlement 객체를위한 공장을 만들었습니다. 공장의 인스턴스화를위한 매개 변수로서 xnamespace 객체를 지정했습니다. 따라서 공장에서 xlement가 생성 될 때마다 네임 스페이스가 자동으로 추가됩니다. 다음은 공장의 코드입니다.
internal class XElementFactory
{
private readonly XNamespace currentNs;
public XElementFactory(XNamespace ns)
{
this.currentNs = ns;
}
internal XElement CreateXElement(String name, params object[] content)
{
return new XElement(currentNs + name, content);
}
}
예, XMLNS가 XmlElement에서 방지 할 수 있습니다. 첫 번째 시간을 창조합니다
<trkpt lat="30.53597" lon="-97.753324" xmlns="">
<ele>249.118774</ele>
<time>2006-05-05T14:34:44Z</time>
</trkpt>
코드 변경 : 이와 같이 XML 네임 스페이스를 전달하십시오.
C# 코드 :
XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");