program story

.NET의 XmlDocument 출력에서 ​​빈 xmlns 속성을 방지하는 방법은 무엇입니까?

inputbox 2020. 7. 25. 10:53
반응형

.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");

참고URL : https://stackoverflow.com/questions/135000/how-to-prevent-blank-xmlns-attributes-in-output-from-nets-xmldocument

반응형