2010-02-19 10 views
8

Mam funkcji, która generuje XML dla obiektu listy:Xelement funkcji Dodaj dodaje xmlns = "" do Xelement

public XDocument ToXML() 
{ 
    foreach (var row in this) 
    { 
     var xml = row.ToXml(); 
     template.Root.Add(xml); 
    } 
    return template; 
} 

template.ToString() brzmi: <RootElement xmlns="urn:testTools">

xml brzmi: <Example><SubElement>testData</SubElement></Example>

Po funkcja add wykonała template.ToString() brzmi: <RootElement xmlns="urn:testTools"><Example xmlns=""><SubElement>testData</SubElement></Example>

Z jakiegoś powodu dodano pustą przestrzeń nazw, w jaki sposób mogę temu zapobiec?

Odpowiedz

7

Ustaw przestrzeń nazw w elementach Przykład i Podrzędność na taki sam, jak element RootElement. Dodaje xmlns = "", aby wyczyścić przestrzeń nazw dla tych elementów.

+0

Ok Teraz rozumiem, dlaczego to robi, dziękuję! Ale jest to użyteczne tylko wtedy, gdy scalasz różne pliki XML, z różnymi przestrzeniami nazw, a nie podczas tworzenia pojedynczego dokumentu xml. Ponadto pusty znacznik przestrzeni nazw jest nieprawidłowy xml. – JJoos

+1

@JJoos: pusta przestrzeń nazw jest z pewnością poprawnym kodem XML. Co sprawia, że ​​myślisz, że tak nie jest? Pamiętaj też, że pojedynczy dokument XML może zawierać elementy i atrybuty z wielu przestrzeni nazw. –

+0

@John Saunders masz rację, pomyślałem, że było nielegalne z powodu: http://www.w3.org/TR/REC-xml-names/ Punkt 2.2 w pierwszej linii. Trochę mylące. Dzięki. – JJoos

0

To może być to, że korzeń musi być prawidłowo zamknięty:

<RootElement xmlns="urn:testTools"> to <RootElement xmlns="urn:testTools"/> 
0

Rozwiązałem go zastępując elementy z regex. Rozwiązanie Foole nie działało, ponieważ nie zawsze miałem teraz dokładną przestrzeń nazw w tym punkcie kodu.

Więc oto moje brudne hack, który działa:

template = XDocument.Parse(new Regex("<ElementName.*>") 
    .Replace(template.ToString(SaveOptions.DisableFormatting), "<ElementName>")); 
+4

Uważaj na swoje wyrażenia regularne. XML nie jest zwykłym językiem, więc generalnie wyrażeń regularnych nie należy używać w stosunku do XML. –

9

Oto przykład, który wyprowadza xml bez pustych przestrzeni nazw. Zwróć uwagę na dziwaczną składnię Linin rootNamespace + "MyElementName", która jest tajemnicą. Jest to ta sama przestrzeń nazw co cały dokument, dlatego nie jest konieczne dodawanie xmlns. Jest to łączenie XNamespace + ciąg, który jest "+" przeciążeniem, które działa dla Linq i że Linq wie, jak sobie z tym poradzić. (Bez Linq może to być błąd kompilacji, aby połączyć ciąg znaków i typ inny niż ciąg). Zauważ, że to zostało wykonane przeciwko plikowi projektu C#, który jest poręcznym plikiem Xml. Wyprowadź go do konsoli lub kontrolki richtextbox. Następnie usuń "rootNamespace +" i zauważ różnicę.

 XDocument doc = null; 

     using (StreamReader streamReader = 
      new StreamReader(@"myXml.csproj")) 
     { 
      doc = XDocument.Load(streamReader, LoadOptions.None); 
     } 
     XNamespace rootNamespace = doc.Root.Name.NamespaceName; 

     // A search which finds the ItemGroup which has Reference 
     // elements and returns the ItemGroup XElement. 
     XElement element = doc.Descendants().Where(p => p.Name.LocalName == "ItemGroup" 
      && p.Descendants().First<XElement>().Name.LocalName == "Reference").First<XElement>(); 

     // Create a completly new element with sub elements. 
     XElement referenceElement = new XElement(rootNamespace + "Reference", 
      new XElement(rootNamespace + "SpecificVersion", bool.FalseString), 
      new XElement(rootNamespace + "HintPath", "THIS IS A HINT PATH")); 

     // Add the new element to the main doc, to the end of the Reference elements. 
     element.Add(referenceElement); 

     // Add an attribute after the fact for effect. 
     referenceElement.SetAttributeValue("Include", "THIS IS AN INCLUDE"); 

     rtb.Text = doc.ToString(SaveOptions.None); 
+0

Dziękujemy, że wygląda na naprawdę dobre rozwiązanie! Spróbuję tego następnym razem, gdy będę się pojawiał w tym problemie. – JJoos

+1

Dziękujemy! To było bardzo pomocne! –

+1

Dzięki. To było świetne! +1 –