2008-08-25 29 views
15

.NET XML teknolojilerini işimde oldukça kapsamlı kullanıyorum. Çok sevdiğim şeylerden biri de XSLT motoru, daha doğrusu onun genişletilebilirliğidir. Ancak orada bir sıkıntı kaynağı olmaya devam eden küçük bir parça var. Büyük bir şey ya da yaşayamayacağımız bir şey değil, üretmek istediğimiz güzel XML'i üretmemizi engelliyor..NET XmlWriter'de doğru ad alanı yönetimi

Yaptığımız şeylerden biri, düğümleri satır içi ve düğümleri bir XML belgesinden diğerine aktarmaktır.

Ne yazık ki, düğümleri bir XmlTextWriter'a kaydettiğinizde (aslında XmlWriter.Create(Stream) döndürürse), ad alanı tanımları gerekli (daha önce tanımlanmış) olsun ya da olmasın, oraya atılır.

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

herkes kendi ad tanımları hakkında verimli olmak için .NET ikna etmek nasıl bir öneri var mı: Aşağıdaki xml tür olsun?

sayesinde Boaz

PS. Ek bir bonus olarak, varsayılan ad alanını geçersiz kılmak ve bir düğüm yazarken onu değiştirmek istiyorum.

cevap

0

This yayın yararlı olabilir. Ayrıca XmlTextWriter \ XmlTextReader sınıflarının Ad alanları özelliğine bakın.

+0

'XmlTextReader' ve' XmlTextWriter' esasen amortismana tabi tutulur ve önerilen 'Create' yöntemlerle çalışıyorsanız doğrudan kullanılamaz. Her halükarda, bu ödülünü eklediğimde buradaydı, umarım uygun değildir. Bu, mükemmel bir şekilde ifade edilen soruyu yanıtlamıyor, * viz *, ".NET'in ad alanı tanımları konusunda verimli olması için nasıl ikna edilmesi." Ben sadece bir özel okuyucu veya yazar aracılığıyla mümkün olabilir, ancak yerel bir çözüm varsa bu bir kesmek veririm. – harpo

1

Bunun aradığınız ne emin değilim, ama XML akışına yazmaya başladığınızda kod bu tür kullanabilirsiniz:

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

XmlWriter yeniden hatırlamak ve olmamalıdır artık % 100 kurşun geçirmez olmayabilir, ancak çoğu zaman çalışır.

+0

Olmalı, ama değil. Sadece ayağımı ağzımdan uzak tutmak için, şimdi tekrar kontrol edeyim. – harpo

14

kullanın bu kod:

<?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' kullanmak için bunu değiştirin ve onu yedekleyeceğim. –

+0

@ John: Bitti. Ama amacı nedir? İhtimali ne? –

+4

@polish: oranlar? Ne demek istiyorsun? Asıl konu şu ki, insanlar örneklerimizi kopyalayıp yapıştırıyorlar ve hiç kimse .NET 2.0'dan itibaren “yeni XmlTextWriter” kullanmamalıdır. –

1

Bunu denemek istediniz:

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(); 
} 

Bu kod istenilen çıktıyı üretti?

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 

İlginç olan 'NamespaceHandling.OmitDuplicates'

+0

kullanarak Bu ilginç. Yine de .NET 2.0'deyim. – harpo

+0

@harpo: Bu .NET 2.0'dır (http://msdn.microsoft.com/de-de/library/ms162617%28v=vs.80%29.aspx) – habakuk

+0

'XmlWriterSettings', ancak' NamespaceHandling''dir. özellik değil. http://msdn.microsoft.com/en-us/library/system.xml.xmlwritersettings.namespacehandling%28v=VS.100%29.aspx – harpo