C # XML dosyalarını ayrıştırma basit bir yöntemi var mı? Öyleyse ne olmuş?
C # XML dosyalarını ayrıştırma basit bir yöntemi var mı? Öyleyse ne olmuş?
Yanıtlar:
.NET 3.5 veya daha üstündeyseniz, LINQ to XML kullanırdım .
Çok basit. Bunların standart yöntemler olduğunu biliyorum, ancak bununla daha iyi başa çıkmak için kendi kütüphanenizi oluşturabilirsiniz.
İşte bazı örnekler:
XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file
// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");
// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);
Ayrıca, çalışmak için başka yöntemler de vardır. Örneğin, burada . Ve bence bunu yapmanın en iyi yolu yok; her zaman kendiniz seçmeniz gerekir, sizin için en uygun olanı.
InnerText
Burada alt düğümlerin tüm değerleriyle birleştirilen bu düğümün değerini alır - değil mi? İstemek garip bir şey gibi görünüyor.
InnerText
zaman sadece düğüm değerini döndürür.
Xsd.exe ile bir sınıf kümesi oluşturmak için iyi bir XSD Şeması kullanın veXmlSerializer
siz de onların XML ve yardımcısı bir nesne ağacı dışarı oluşturun. Modelinizde çok az kısıtlamanız varsa, Xml * Nitelikleri ile model sınıfları ve XML arasında doğrudan bir eşleme oluşturmayı bile deneyebilirsiniz.
Orada XML Serialization hakkında tanıtıcı bir makaleMSDN'de .
Performans ipucu: An oluşturmak XmlSerializer
pahalıdır. XmlSerializer
Birden fazla XML dosyasını ayrıştırmak / yazmak istiyorsanız örneğinize bir referans tutun .
Büyük miktarda veri (çok megabayt) XmlReader
işliyorsanız, XML'yi ayrıştırmak için kullanmak istiyorsunuz .
(Başka bir şey XPathNavigator
, XElement
, XmlDocument
hatta ve XmlSerializer
tam oluşturulan nesne grafiği tutmak ise) neden olacaktır yüksek bellek kullanımı da çok yavaş bir yükleme süresini ve.
Tabii ki, yine de bellekteki tüm verilere ihtiyacınız varsa, o zaman fazla seçeneğiniz olmayabilir.
Kullanım XmlTextReader
, XmlReader
, XmlNodeReader
ve System.Xml.XPath
ad alanı. Ve ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Genellikle XPath
XML okumayı kolaylaştırır, aradığınız şey budur.
new XmlTextReader()
veya kullanmamalısınız new XmlTextWriter()
. .NET 2.0'dan beri kullanımdan kaldırıldı. Kullanın XmlReader.Create()
veya XmlWriter.Create()
bunun yerine.
Kısa süre önce bir XML belgesinin ayrıştırılmasını içeren bir uygulama üzerinde çalışmam gerekiyordu ve Jon Galloway ile LINQ to XML tabanlı yaklaşımın bence en iyisi olduğunu kabul ediyorum. Ancak kullanılabilir örnekler bulmak için biraz kazmak zorunda kaldım, bu yüzden daha fazla uzatmadan, işte birkaç tane!
Bu kod çalışıyor gibi herhangi bir yorum hoş geldiniz ama mükemmel olmayabilir ve ben bu proje için XML ayrıştırma hakkında daha fazla bilgi edinmek istiyorum!
public void ParseXML(string filePath)
{
// create document instance using XML file path
XDocument doc = XDocument.Load(filePath);
// get the namespace to that within of the XML (xmlns="...")
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
// obtain a list of elements with specific tag
IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;
// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();
// obtain an element from within an element, same as from doc
XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();
// obtain an attribute from an element
XAttribute attribute = element.Attribute("exampleAttributeName");
}
Bu işlevler ile XML dosyasındaki herhangi bir öğeyi ve herhangi bir özniteliği ayrıştıramadım.
.NET 2.0 kullanıyorsanız, denemek XmlReader
ve alt sınıfları XmlTextReader
ve XmlValidatingReader
. Bir XML dosyasını ayrıştırmak için hızlı, hafif (bellek kullanımı vb.) Yalnızca ileri bir yol sağlarlar.
XPath
Yeteneklere ihtiyacınız varsa XPathNavigator
. Bellekteki tüm belgeye ihtiyacınız varsa deneyin XmlDocument
.
Ek olarak, XPath seçicisini aşağıdaki şekilde kullanabilirsiniz (belirli düğümleri seçmenin kolay yolu):
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'
// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
book.InnerText="The story began as it was...";
}
Console.WriteLine("Display XML:");
doc.Save(Console.Out);
"XML ayrıştırmak için en iyi uygulama" olup olmadığından emin değilim. Farklı durumlar için çok sayıda teknoloji uygundur. Hangi yolun kullanılacağı somut senaryoya bağlıdır.
Sen gidebilirsiniz XML LINQ , XmlReader
, XPathNavigator
hatta düzenli ifadeler. İhtiyaçlarınızı detaylandırırsanız, bazı önerilerde bulunmaya çalışabilirim.
Bu kitaplığı kullanarak XML'yi ayrıştırabilirsiniz System.Xml.Linq
. Bir XML dosyasını ayrıştırmak için kullandığım örnek kod aşağıdadır
public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);
XDocument xDoc = XDocument.Load(path);
XElement xElement = XElement.Parse(xDoc.ToString());
List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
{
Code = Convert.ToString(d.Element("CategoryCode").Value),
CategoryPath = d.Element("CategoryPath").Value,
Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
}).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();
CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);
return catSubCatList;
}
Serileştirmek ve serisini kaldırmak için ExtendedXmlSerializer'ı kullanabilirsiniz .
Instalation ExtendedXmlSerializer'ı nuget'ten yükleyebilir veya aşağıdaki komutu çalıştırabilirsiniz:
Install-Package ExtendedXmlSerializer
Serile:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
deserialization
var obj2 = serializer.Deserialize<Message>(xml);
.NET'te standart XML Serializer çok sınırlıdır.
ExtendedXmlSerializer bunu ve çok daha fazlasını yapabilir.
ExtendedXmlSerializer .NET 4.5 veya üstünü ve .NET Core'u destekler . WebApi ve AspCore ile entegre edebilirsiniz.
XmlDocument kullanabilirsiniz ve özniteliklerden veri değiştirmek veya almak için Linq to XML sınıfları yapabilirsiniz.