Jak analizować pliki XML? [zamknięte]
Czy istnieje prosta metoda parsowania plików XML w C#? Jeśli tak, to co?
12 answers
Użyłbym LINQ do XML jeśli jesteś w.NET 3.5 lub wyższej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 15:45:33
To bardzo proste. Wiem, że są to standardowe metody, ale możesz stworzyć własną bibliotekę, aby poradzić sobie z tym znacznie lepiej.
Oto kilka przykładów:
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);
Istnieje również kilka innych metod do pracy. Na przykład tutaj . I myślę, że nie ma jednej najlepszej metody, aby to zrobić; zawsze musisz wybrać to sam, co jest najbardziej odpowiednie dla Ciebie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 04:15:20
Użyj dobrego schematu XSD , aby utworzyć zestaw klas z xsd.exe i używać XmlSerializer
aby utworzyć drzewo obiektów z XML i odwrotnie. Jeśli masz kilka ograniczeń dotyczących modelu, możesz nawet spróbować utworzyć bezpośrednie mapowanie między klasami modelu a XML z atrybutami XML*.
Istnieje artykuł wprowadzający o serializacji XML na MSDN.
Wskazówka dotycząca wydajności: Budowa XmlSerializer
jest kosztowna. Zachowaj odniesienie do twoja instancja XmlSerializer
, jeśli zamierzasz parsować / zapisywać wiele plików XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:22:55
Jeśli przetwarzasz dużą ilość danych (wiele megabajtów), chcesz używać XmlReader
do strumieniowego analizowania XML.
Anything else (XPathNavigator
, XElement
, XmlDocument
i nawet XmlSerializer
Jeśli zachowasz pełny wygenerowany Wykres obiektu) spowoduje wysokie zużycie pamięci , a także bardzo powolny czas ładowania.
Oczywiście, jeśli i tak potrzebujesz wszystkich danych w pamięci, możesz nie mieć dużego wyboru.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:49
Użycie XmlTextReader
, XmlReader
, XmlNodeReader
oraz System.Xml.XPath
przestrzeń nazw. Oraz (XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Zwykle XPath
ułatwia czytanie XML, czyli to, czego możesz szukać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:21:32
Jeśli używasz. NET 2.0, spróbuj XmlReader
i jego podklas XmlTextReader
i XmlValidatingReader
. Zapewniają szybki, lekki (zużycie pamięci itp.), forward-jedyny sposób na analizę pliku XML.
Jeśli potrzebujesz XPath
możliwości, spróbuj XPathNavigator
. Jeśli potrzebujesz całego dokumentu w pamięci, spróbuj XmlDocument
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:22:24
Nie jestem pewien, czy istnieje "najlepsza praktyka parsowania XML". Istnieje wiele technologii dostosowanych do różnych sytuacji. Sposób użycia zależy od konkretnego scenariusza.
Możesz przejść z LINQ do XML, XmlReader
, XPathNavigator
lub nawet wyrażenia regularne. Jeśli sprecyzujesz swoje potrzeby, mogę spróbować dać kilka sugestii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-16 01:21:51
Niedawno zostałem zmuszony do pracy nad aplikacją, która wymagała parsowania dokumentu XML i zgadzam się z Jonem Gallowayem, że podejście oparte na LINQ do XML jest moim zdaniem najlepsze. Musiałem jednak trochę pokopać, aby znaleźć użyteczne przykłady, więc bez zbędnych ceregieli, oto kilka!
Wszelkie komentarze mile widziane, ponieważ ten kod działa, ale może nie być doskonały i chciałbym dowiedzieć się więcej o parsingu XML dla tego projektu!
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");
}
Z tymi funkcjami byłem możliwość parsowania dowolnego elementu i dowolnego atrybutu z pliku XML bez problemu!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 11:09:28
Możesz przeanalizować XML używając tej biblioteki System.Xml.Linq
. Poniżej znajduje się przykładowy kod, którego użyłem do analizy pliku XML
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 19:05:59
Dodatkowo możesz użyć selektora XPath w następujący sposób (łatwy sposób na wybranie konkretnych węzłów):
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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 12:19:38
Możesz użyć ExtendedXmlSerializer do serializacji i deserializacji.
Instalacja Możesz zainstalować ExtendedXmlSerializer z nuget lub uruchomić następujące polecenie:
Install-Package ExtendedXmlSerializer
Serializacja:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
Deserializacja
var obj2 = serializer.Deserialize<Message>(xml);
Standardowy Serializer XML w. NET jest bardzo ograniczony.
- nie obsługuje serializacji klasy z odniesieniem kołowym lub klasy z interfejsem własność,
- nie obsługuje słowników,
- nie ma mechanizmu do odczytu starej wersji XML,
- jeśli chcesz utworzyć niestandardowy serializer, twoja klasa musi dziedziczyć z IXmlSerializable. Oznacza to, że twoja klasa nie będzie klasą POCO,
- nie obsługuje MKOl.
ExtendedXmlSerializer może to zrobić i wiele więcej.
ExtendedXmlSerializer support . NET 4.5lub wyższy i . Net Core. Można zintegrować to z WebApi i AspCore.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 14:26:33
Możesz użyć XmlDocument i do manipulowania lub pobierania danych z atrybutów możesz Linq do klas XML.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 12:27:26