Počet atributů XML elementu (XPath)   zodpovězená otázka

C#, XML

Ahoj,

potřeboval bych radu. Chci získat první element XML dokumentu, která má méně než dva atributy (resp. obsahuje pouze atributy Text a Filename). Řešení mám pomocí třídy XMLDocument. Bylo by řešení pomocí XPathDocument výrazně rychlejší u větších XML dokumentů?

Můj aktuální kód vypadá takto

XmlDocument xml = new XmlDocument();
xml.Load(path);

XmlNode root = xml.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
    XmlElement element = (XmlElement)node;
    if (element.Attributes.Count <= 2)
    {
        // Nalezeno
        return;
    }
}

Jaké máte zkušenosti s XMLDocument vs. XPathDocument? Jak realizovat stejný proces pomocí XPathDocument? Předem díky za odpověď :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No s rychlostí Vám určitě nepomohu, nikdy jsem to neřešil.

Řešení v LINQ to XML:

Testovací xml

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <El Text="text1" FileName="fileq" />
  <El Texta="text2" FileNamec="filew" />
  <El Text="text3" FileName="filee" />
  <El Text="text4" FileName="filer" Jiny="jiny" />  
</Root>

linq:

using System.Linq;
using System.Xml.Linq;

            var xDoc = XDocument.Load("D:\\testXml.xml");

            if (xDoc.Root != null)
            {
                var result = from n in xDoc.Root.Elements()
                    where n.Attributes().Count() == 2
                    where n.Attribute("Text") != null
                    where n.Attribute("FileName") != null
                    select n;

                var resultList = result.ToList();

                //.....
            }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podle mého názoru XPath moc vyšší výkon nepřinese (možná pokud umí multithreading). Mohl by vám ale pomoci XmlReader, protože ten nenačítá celý dokument do paměti, ale čte ho postupně. Případně už zmíněné LINQ to XML by mělo být o trochu rychlejší než XmlDocument a ještě by to šlo vylepšit pomocí Parallel.ForEach() nebo .AsParallel().

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Také si myslím, že XPath bude pomalejší než LINQ to XML (nebo XDocument).

Pokud je váš XML dokument velký, ještě můžete zkusit použít XStreamingElement (http://msdn.microsoft.com/en-us/library/.... Ten se liší v tom, že nebude celý XML dokument načítán do paměti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji všem za odpověď. Jsou to pro mě cenné informace a zkušenosti :).. LINQ bude v tomto případě asi nejelegantnější řešení ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě jsem tu našel nějaký testík na XPath http://blog.dreamlabsolutions.com/post/2... vychází tu asi 4x pomalejší

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zajímavé, děkuju :).. abych se přiznal, teprve s XML (resp. větší práce s daty) začínám, takže na ty mé malinkaté soubory je to vcelku jedno, ale zajímalo mě, jaký přístup k tomu mají ostatní s většími zkušenostmi.

Všem děkuji za odpovědi ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback