C# Language
XmlDocument och System.Xml-namnutrymmet
Sök…
Grundläggande XML-dokumentinteraktion
public static void Main()
{
var xml = new XmlDocument();
var root = xml.CreateElement("element");
// Creates an attribute, so the element will now be "<element attribute='value' />"
root.SetAttribute("attribute", "value");
// All XML documents must have one, and only one, root element
xml.AppendChild(root);
// Adding data to an XML document
foreach (var dayOfWeek in Enum.GetNames((typeof(DayOfWeek))))
{
var day = xml.CreateElement("dayOfWeek");
day.SetAttribute("name", dayOfWeek);
// Don't forget to add the new value to the current document!
root.AppendChild(day);
}
// Looking for data using XPath; BEWARE, this is case-sensitive
var monday = xml.SelectSingleNode("//dayOfWeek[@name='Monday']");
if (monday != null)
{
// Once you got a reference to a particular node, you can delete it
// by navigating through its parent node and asking for removal
monday.ParentNode.RemoveChild(monday);
}
// Displays the XML document in the screen; optionally can be saved to a file
xml.Save(Console.Out);
}
Läser från XML-dokument
Ett exempel på XML-fil
<Sample>
<Account>
<One number="12"/>
<Two number="14"/>
</Account>
<Account>
<One number="14"/>
<Two number="16"/>
</Account>
</Sample>
Läser från denna XML-fil:
using System.Xml;
using System.Collections.Generic;
public static void Main(string fullpath)
{
var xmldoc = new XmlDocument();
xmldoc.Load(fullpath);
var oneValues = new List<string>();
// Getting all XML nodes with the tag name
var accountNodes = xmldoc.GetElementsByTagName("Account");
for (var i = 0; i < accountNodes.Count; i++)
{
// Use Xpath to find a node
var account = accountNodes[i].SelectSingleNode("./One");
if (account != null && account.Attributes != null)
{
// Read node attribute
oneValues.Add(account.Attributes["number"].Value);
}
}
}
XmlDocument vs XDocument (exempel och jämförelse)
Det finns flera sätt att interagera med en XML-fil.
- Xml-dokument
- XDocument
- XmlReader / XMLwriter
Innan LINQ till XML användes XMLDocument för manipulationer i XML som att lägga till attribut, element och så vidare. Nu använder LINQ till XML XDocument för samma typ av sak. Syntaxer är mycket enklare än XMLDocument och det kräver en minimal mängd kod.
XDocument är också snabbare än XmlDocument. XmlDoucument är en gammal och smutsig lösning för fråga om ett XML-dokument.
Jag ska visa några exempel på klass XMLDocument och klass XDocument :
Ladda XML-fil
string filename = @"C:\temp\test.xml";
XMLDocument
XmlDocument _doc = new XmlDocument();
_doc.Load(filename);
XDocument
XDocument _doc = XDocument.Load(fileName);
Skapa XmlDocument
XMLDocument
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);
XDocument
XDocument doc = new XDocument(
new XElement("Root", new XAttribute("name", "value"),
new XElement("Child", "text node"))
);
/*result*/
<root name="value">
<child>"TextNode"</child>
</root>
Ändra InnerText för nod i XML
XMLDocument
XmlNode node = _doc.SelectSingleNode("xmlRootNode");
node.InnerText = value;
XDocument
XElement rootNote = _doc.XPathSelectElement("xmlRootNode");
rootNode.Value = "New Value";
Spara fil efter redigering
Se till att säkerställa xml efter alla ändringar.
// Safe XmlDocument and XDocument
_doc.Save(filename);
Återgå värden från XML
XMLDocument
XmlNode node = _doc.SelectSingleNode("xmlRootNode/levelOneChildNode");
string text = node.InnerText;
XDocument
XElement node = _doc.XPathSelectElement("xmlRootNode/levelOneChildNode");
string text = node.Value;
Hämta värde från alla från alla barnelement där attribut = något.
XMLDocument
List<string> valueList = new List<string>();
foreach (XmlNode n in nodelist)
{
if(n.Attributes["type"].InnerText == "City")
{
valueList.Add(n.Attributes["type"].InnerText);
}
}
XDocument
var accounts = _doc.XPathSelectElements("/data/summary/account").Where(c => c.Attribute("type").Value == "setting").Select(c => c.Value);
Lägg till en nod
XMLDocument
XmlNode nodeToAppend = doc.CreateElement("SecondLevelNode");
nodeToAppend.InnerText = "This title is created by code";
/* Append node to parent */
XmlNode firstNode= _doc.SelectSingleNode("xmlRootNode/levelOneChildNode");
firstNode.AppendChild(nodeToAppend);
/*After a change make sure to safe the document*/
_doc.Save(fileName);
XDocument
_doc.XPathSelectElement("ServerManagerSettings/TcpSocket").Add(new XElement("SecondLevelNode"));
/*After a change make sure to safe the document*/
_doc.Save(fileName);