Pierwszy przykład pomógł mi napisać funkcję rozszerzającą dla arkusza stylów XSLT , która zwraca zestaw węzłów do procesora. Dzięki!
CodeManX
1
Będę argumentować, że jeśli otrzymuje XmlElementsię var, pierwsza byłoby znacznie łatwiej pracować
Robert Perry
1
Praca ze słownikiem -> poziom2 powyżej pochodzi ze słownika w moim przypadku (na wypadek, gdyby ktoś uznał go za przydatny) Próbując pierwszego przykładu natknąłem się na ten błąd:
„Ten dokument ma już węzeł„ DocumentElement ”."
Zainspirowała mnie odpowiedź tutaj
i edytować mój kod: (xmlDoc. DocumentElement .AppendChild (body))
//a dictionary:
Dictionary<string, string> Level2Data
{
{"level2", "text"},
{"level2", "other text"},
{"same_level2", "more text"}
}
//xml Decalration:
XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
XmlElement root = xmlDoc.DocumentElement;
xmlDoc.InsertBefore(xmlDeclaration, root);
// add body
XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty);
xmlDoc.AppendChild(body);
XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty);
xmlDoc.DocumentElement.AppendChild(body); //without DocumentElement ->ERRforeach (KeyValuePair<string, string> entry in Level2Data)
{
//write to xml: - it works version 1.
XmlNode keyNode = xmlDoc.CreateElement(entry.Key); //open TAB
keyNode.InnerText = entry.Value;
body.AppendChild(keyNode); //close TAB//Write to xmml verdion 2: (uncomment the next 4 lines and comment the above 3 - version 1//XmlElement key = xmlDoc.CreateElement(string.Empty, entry.Key, string.Empty);//XmlText value = xmlDoc.CreateTextNode(entry.Value);//key.AppendChild(value);//body.AppendChild(key);
}
Obie wersje (1 i 2 wewnątrz każdej pętli) dają wyjście:
(Uwaga: trzecia linijka "ten sam poziom2" w słowniku może być również level2 jak pozostałe, ale chciałem zilustrować zalety słownika - w moim przypadku potrzebowałem level2 z różnymi nazwami.
Odpowiedzi:
Co powiesz na:
#region Using Statements using System; using System.Xml; #endregion class Program { static void Main( string[ ] args ) { XmlDocument doc = new XmlDocument( ); //(1) the xml declaration is recommended, but not mandatory XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration( "1.0", "UTF-8", null ); XmlElement root = doc.DocumentElement; doc.InsertBefore( xmlDeclaration, root ); //(2) string.Empty makes cleaner code XmlElement element1 = doc.CreateElement( string.Empty, "body", string.Empty ); doc.AppendChild( element1 ); XmlElement element2 = doc.CreateElement( string.Empty, "level1", string.Empty ); element1.AppendChild( element2 ); XmlElement element3 = doc.CreateElement( string.Empty, "level2", string.Empty ); XmlText text1 = doc.CreateTextNode( "text" ); element3.AppendChild( text1 ); element2.AppendChild( element3 ); XmlElement element4 = doc.CreateElement( string.Empty, "level2", string.Empty ); XmlText text2 = doc.CreateTextNode( "other text" ); element4.AppendChild( text2 ); element2.AppendChild( element4 ); doc.Save( "D:\\document.xml" ); } }
(1) Czy prawidłowy plik XML wymaga deklaracji xml?
(2) Jaka jest różnica między String.Empty a „” (pusty ciąg)?
Wynik to:
<?xml version="1.0" encoding="UTF-8"?> <body> <level1> <level2>text</level2> <level2>other text</level2> </level1> </body>
Ale polecam użycie LINQ to XML, który jest prostszy i bardziej czytelny, jak tutaj:
#region Using Statements using System; using System.Xml.Linq; #endregion class Program { static void Main( string[ ] args ) { XDocument doc = new XDocument( new XElement( "body", new XElement( "level1", new XElement( "level2", "text" ), new XElement( "level2", "other text" ) ) ) ); doc.Save( "D:\\document.xml" ); } }
źródło
XmlElement
sięvar
, pierwsza byłoby znacznie łatwiej pracowaćPraca ze słownikiem -> poziom2 powyżej pochodzi ze słownika w moim przypadku (na wypadek, gdyby ktoś uznał go za przydatny) Próbując pierwszego przykładu natknąłem się na ten błąd: „Ten dokument ma już węzeł„ DocumentElement ”." Zainspirowała mnie odpowiedź tutaj
i edytować mój kod: (xmlDoc. DocumentElement .AppendChild (body))
//a dictionary: Dictionary<string, string> Level2Data { {"level2", "text"}, {"level2", "other text"}, {"same_level2", "more text"} } //xml Decalration: XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null); XmlElement root = xmlDoc.DocumentElement; xmlDoc.InsertBefore(xmlDeclaration, root); // add body XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty); xmlDoc.AppendChild(body); XmlElement body = xmlDoc.CreateElement(string.Empty, "body", string.Empty); xmlDoc.DocumentElement.AppendChild(body); //without DocumentElement ->ERR foreach (KeyValuePair<string, string> entry in Level2Data) { //write to xml: - it works version 1. XmlNode keyNode = xmlDoc.CreateElement(entry.Key); //open TAB keyNode.InnerText = entry.Value; body.AppendChild(keyNode); //close TAB //Write to xmml verdion 2: (uncomment the next 4 lines and comment the above 3 - version 1 //XmlElement key = xmlDoc.CreateElement(string.Empty, entry.Key, string.Empty); //XmlText value = xmlDoc.CreateTextNode(entry.Value); //key.AppendChild(value); //body.AppendChild(key); }
Obie wersje (1 i 2 wewnątrz każdej pętli) dają wyjście:
<?xml version="1.0" encoding="UTF-8"?> <body> <level1> <level2>text</level2> <level2>ther text</level2> <same_level2>more text</same_level2> </level1> </body>
(Uwaga: trzecia linijka "ten sam poziom2" w słowniku może być również level2 jak pozostałe, ale chciałem zilustrować zalety słownika - w moim przypadku potrzebowałem level2 z różnymi nazwami.
źródło