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

StackOverflow https://stackoverflow.com/questions/135000

문제

.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");
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top