.NET의 XmlDocument 출력에서 빈 xmlns 속성을 방지하는 방법은 무엇입니까?
.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 생성 XML을 사용하여 특정 프로토콜의 표준 XML을 일치시킬 수 있는지 확인하는 것입니다. blank xmlns
속성 은 파서를 깨뜨 리거나 혼동하지 않을 수도 있지만,이 프로토콜에서 본 사용법에는 없습니다.
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의 답변의 변형입니다 (매우 감사합니다!)
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
당신을 위해 자동으로 추가 된 속성.
root는 접두사가없는 네임 스페이스에 있으므로 네임 스페이스를 지정하지 않으려는 루트의 하위는 예제와 같이 출력되어야합니다. 해결책은 다음과 같이 루트 요소 앞에 접두사를 붙이는 것입니다.
<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);
It's safer, and you can control the namespaces with attributes if you really need more control.
I've solved the problem by using the Factory Pattern. I created a factory for XElement objects. As parameter for the instantiation of the factory I've specified a XNamespace object. So, everytime a XElement is created by the factory the namespace will be added automatically. Here is the code of the factory:
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);
}
}
Yes you can prevent the XMLNS from the XmlElement . First Creating time it is coming : like that
<trkpt lat="30.53597" lon="-97.753324" xmlns="">
<ele>249.118774</ele>
<time>2006-05-05T14:34:44Z</time>
</trkpt>
Change the code : And pass xml namespace like this
C# code:
XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1");
bookElement.SetAttribute("lat", "30.53597");
bookElement.SetAttribute("lon", "97.753324");
'program story' 카테고리의 다른 글
ESI 및 EDI 레지스터의 목적은 무엇입니까? (0) | 2020.07.25 |
---|---|
"정적"과 "정적 인라인"기능의 차이점은 무엇입니까? (0) | 2020.07.25 |
C #은 Java의 charAt ()에 해당합니까? (0) | 2020.07.25 |
Java에서 toString 메소드를 사용하는 방법은 무엇입니까? (0) | 2020.07.25 |
여러 빌드 구성에 대해 다른 app.config를 선택하는 방법 (0) | 2020.07.25 |