2008-08-25 6 views
15

.NET XML 기술을 제 작업에 광범위하게 사용합니다. 내가 좋아하는 것들 중 하나는 XSLT 엔진, 더 정확하게는 XSLT 엔진의 확장 성입니다. 그러나 거기에 성가심의 원천이되는 하나의 작은 조각. 우리가 살 수없는 주요한 것이나 무언가는 없지만 우리가 생산하고자하는 아름다운 XML을 만들어 내지 못하게합니다..NET XmlWriter의 적절한 네임 스페이스 관리

우리가하는 일 중 하나는 노드를 인라인으로 변환하고 하나의 XML 문서에서 다른 XML 문서로 노드를 가져 오는 것입니다.

슬프게도 노드를 XmlTextWriter (실제로는 XmlWriter.Create(Stream)이 반환)에 저장하면 네임 스페이스 정의가 필요하거나 (이전에 정의 된) 관계없이 네임 스페이스 정의가 모두 던져집니다.

<root xmlns:abx="http://bladibla"> 
    <abx:child id="A"> 
     <grandchild id="B"> 
      <abx:grandgrandchild xmlns:abx="http://bladibla" /> 
     </grandchild> 
    </abx:child> 
</root> 

사람이 네임 스페이스 정의에 대한 효율적 .NET을 설득하는 방법에 대한 제안이 있습니까 다음과 같은 XML의 종류를 얻을?

감사합니다, 보아스

PS. 추가 보너스로 노드를 쓸 때 기본 네임 스페이스를 변경하고 싶습니다.

답변

0

This 게시물이 도움이 될 수 있습니다. 이름 공간XmlTextWriter \ XmlTextReader 클래스를 살펴보십시오.

+0

'XmlTextReader'와'XmlTextWriter'은 본질적으로 감가 상각하고 있으며, 권장되는'Create' 방법으로 작업하는 경우 직접 사용할 수 없습니다. 여하튼, 제가 현상금을 추가했을 때 여기에 있었기 때문에 그것이 자격이되지 않기를 바랍니다. 이 질문에 대해서는 대답하지 않습니다.이 질문은 "네임 스페이스 정의에 대해 .NET을 효율적으로 설득하는 방법"이라고 완벽하게 말합니다. 나는 그것이 독자적인 독자 또는 작가를 통해서만 가능할 수 있다고 인정하지만, 네이티브 솔루션이 있다면 그것은 해킹이다. – harpo

1

나는 이것이 당신이 찾고있는 무엇 확실하지 않다,하지만 당신은 XML 스트림에 쓰기 시작할 때 이러한 종류의 코드를 사용할 수 있습니다

myWriter.WriteAttributeString("xmlns", "abx", null, "http://bladibla"); 

XmlWriter를가 다시 그것을 기억하고 안 더 이상. 그것은 100 % 방탄일지도 모르지만 대부분의 시간 동안 작동합니다.

+0

그것은해야하지만, 그렇지 않습니다. 내 발을 내 입에서 지키기 위해, 지금 다시 확인해 보겠다. – harpo

14

사용이 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<root xmlns:abx="http://bladibla"> 
    <abx:child id="A"> 
    <grandchild id="B"> 
     <abx:grandgrandchild /> 
    </grandchild> 
    </abx:child> 
</root> 
+0

'XmlWriter.Create'를 사용하도록 변경하면 나는 그것을 upvote 할 것입니다. –

+0

@ 존 : 완료. 그러나 요점은 무엇입니까? 확율은 어떨까요? –

+4

@polish : odds? 무슨 소리 야? 요점은 사람들이 예제를 복사하여 붙여 넣기 때문에 아무도 .NET 2.0에서'new XmlTextWriter'를 사용해서는 안된다는 것입니다. –

1

는 당신이 시도해 봤어 :

using (var writer = XmlWriter.Create("file.xml")) 
{ 
    const string Ns = "http://bladibla"; 
    const string Prefix = "abx"; 

    writer.WriteStartDocument(); 

    writer.WriteStartElement("root"); 

    // set root namespace 
    writer.WriteAttributeString("xmlns", Prefix, null, Ns); 

    writer.WriteStartElement(Prefix, "child", Ns); 
    writer.WriteAttributeString("id", "A"); 

    writer.WriteStartElement("grandchild"); 
    writer.WriteAttributeString("id", "B"); 

    writer.WriteElementString(Prefix, "grandgrandchild", Ns, null); 

    // grandchild 
    writer.WriteEndElement(); 
    // child 
    writer.WriteEndElement(); 
    // root 
    writer.WriteEndElement(); 

    writer.WriteEndDocument(); 
} 

이 코드는 원하는 출력을 생산?

Dim settings = New XmlWriterSettings With {.Indent = True, 
              .NamespaceHandling = NamespaceHandling.OmitDuplicates, 
              .OmitXmlDeclaration = True} 
Dim s As New MemoryStream 
Using writer = XmlWriter.Create(s, settings) 
    ... 
End Using 

흥미있는 'NamespaceHandling.OmitDuplicates'

+0

재미 있습니다. 하지만 .NET 2.0에 있습니다. – harpo

+0

@harpo : 닷넷 2.0 (http://msdn.microsoft.com/de-de/library/ms162617%28vs/vs.80%29.aspx 참조) – habakuk

+0

'XmlWriterSettings'하지만,'NamespaceHandling' 재산은 그렇지 않습니다. http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.namespacehandling%28v=VS.100%29.aspx – harpo

관련 문제