Programim dhe zhvillim, javascript, python, php, html

Merrni një vlerë të përbashkët të elementit nga një XML kompleks

Unë kam të bëj me një skedar XML që ka një strukturë shumë të mbivendosur:

<?xml version="1.0" encoding="utf-8"?>
<Root>
    <Stuff>
        <Item Class="Consumable">
            <CalledAs>ResourceAlpha</CalledAs>
            <ID>ResourceAlpha25367</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceAlpha</CalledAs>
            <ID>ResourceAlpha25368</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceAlpha</CalledAs>
            <ID>ResourceAlpha25371</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceAlpha</CalledAs>
            <ID>ResourceAlpha25372</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceBeta</CalledAs>
            <ID>ResourceBeta25376</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceBeta</CalledAs>
            <ID>ResourceBeta25377</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceBeta</CalledAs>
            <ID>ResourceBeta25381</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceBeta</CalledAs>
            <ID>ResourceBeta25384</ID>
        </Item>
        <Item Class="Consumable">
            <CalledAs>ResourceBeta</CalledAs>
            <ID>ResourceBeta25388</ID>
        </Item>

        <Item Class="Construct">
            <Named>ClosedFolders</Named>
            <ID>ClosedFolders25393</ID>
            <StorageCabinet>(102, 0, 94)</StorageCabinet>
            <AssignedTo>Colonist</AssignedTo>
            <Assigned Class="Consumable">
                <CalledAs>ResourceBeta</CalledAs>
                <ID>ResourceBeta25238</ID>
            </Assigned>
        </Item>
        <Item Class="Construct">
            <Named>ClosedFolders</Named>
            <ID>ClosedFolders25394</ID>
            <StorageCabinet>(105, 0, 95)</StorageCabinet>
            <AssignedTo>Colonist</AssignedTo>
        </Item>
        <Item Class="Construct">
            <Named>ClosedFolders</Named>
            <ID>ClosedFolders25395</ID>
            <StorageCabinet>(103, 0, 92)</StorageCabinet>
            <AssignedTo>Colonist</AssignedTo>
            <Assigned Class="Consumable">
                <CalledAs>ResourceAlpha</CalledAs>
                <ID>ResourceBeta45232</ID>
            </Assigned>         
        </Item>

    </Stuff>
</Root>

Tani, më duhet të marr një listë me të gjitha ID në mënyrë që kur të shtoj një Consumable ose Assigned të ri, të mund të gjeneroj (dhe të sigurohem që është një ID e re unike).

Ja se si po ngarkoj skedarin:

    String savefile = Settings.Default.SelectedSaveFilePath;

    var xmlDocument = new XmlDocument();
    xmlDocument.Load(savefile);

    var selectSingleNode = xmlDocument.SelectSingleNode("/Root/Stuff/Item[@Class='Consumable']");
    if (selectSingleNode != null)
    {
      // Attempt to loop
    }

Tani, në nivelin e /Root/Stuff/Item[@Class='Consumable'], jam i mirë për të marrë <ID>, por ka një fole në /Root/Stuff/Item[@Class='Construct'] që kërkon një lloj nën-për-secili për të marrë <ID><Assigned Class="Consumable">

Po përpiqem të gjeneroj një listë të të gjitha nyjeve <ID> në të gjithë dokumentin dhe nëse është e mundur, një Koleksion i Vlerës së Çelës ku <ID> është vlera dhe Elementi (nga të cilit <ID> i përket) si çelës.

Unë gjithashtu e di se <ID> janë unike në dokument, pavarësisht nga prindi i tyre. Kështu që unë mund të gjej drejtpërdrejt çdo element duke kërkuar vetëm ID-në.

Shpresoj që kjo të ketë më shumë kuptim.

Faleminderit.

28.01.2014

  • Një listë e të gjitha vlerave të elementit ID? Në rregull, kjo tingëllon mjaft e drejtpërdrejtë - por do të mësoni më shumë nëse përpiqeni ta gjeni vetë përgjigjen. Çfarë keni provuar tashmë dhe çfarë shkoi keq? 29.01.2014
  • Nuk mund të bëjë rrugën. Shembulli i dhënë është shumë i thjeshtë. Të dhënat aktuale janë mbi 25 MB XML dhe janë të ndjeshme, kështu që nuk po ngjis. 29.01.2014
  • Çfarë kuptoni me të bërë rrugën? A jeni në gjendje të paktën të ngarkoni dokumentin në LINQ në XML? Nuk kërkova të dhënat e vërteta... 29.01.2014
  • Përditësuar pyetjen. Këtu është ora 2:36 e mëngjesit. Unë jam pak i ngadalshëm. Na vjen keq. 29.01.2014
  • Nuk është e qartë pse po përdorni fare XPath, për të qenë i sinqertë - unë thjesht do të përdor elemente, pasardhës etj. Është gjithashtu e paqartë se çfarë lidhje kanë shprehjet XPath që keni dhënë në kod me XML-në që keni dhënë . 29.01.2014
  • Dhe pse keni përdorur etiketën linq-to-xml kur nuk jeni duke përdorur LINQ në XML? 29.01.2014
  • Unë kisha etiketën për sugjerimet LINQ në XML por kuptova që pas përgjigjeve të para se po ndryshoj shumë. 29.01.2014
  • Epo, a ka ndonjë arsye mos për të përdorur LINQ në XML? 29.01.2014
  • Rruga ka kuptim si në abstragimin e një elementi të veçantë midis shumë elementeve me numër të ndryshëm të elementit fëmijë POR gjithmonë duke pasur ‹ID› 29.01.2014
  • Nuk ka kuptim për XML-në që keni dhënë. Ju lutemi lexoni tinyurl.com/so-hints dhe përmirësoni pyetjen tuaj. Në mënyrë ideale jepni një pjesë përfaqësuese të XML (nuk ka nevojë të përmbajë të dhëna të ndjeshme) dhe një program të shkurtër por të plotë që nuk funksionon, duke shpjeguar se në çfarë mënyre nuk funksionon. Për momentin, informacioni që keni dhënë është shumë i paqartë (dhe i paqëndrueshëm!) që ne t'ju ndihmojmë. 29.01.2014
  • E kam redaktuar shumë pyetjen, Jon Skeet. Ju lutemi, lëreni pyetjen nëse i plotëson kërkesat. Po marr shumë përgjigje pozitive. 29.01.2014
  • Kjo është padyshim më mirë, megjithëse nuk keni ende ndonjë kod që tregon se si po përpiqen të gjeni ID-të dhe nuk i jeni përgjigjur pyetjes nëse mund të përdorni LINQ në XML në vend të kësaj. Nuk jam i sigurt se çfarë nënkuptoni me shumë përgjigje pozitive pasi nuk ka pasur asnjë koment apo përgjigje tjetër që nga koha kur keni redaktuar... 29.01.2014
  • Përgjigjet që tashmë janë të pranishme edhe para redaktimit të parë... lanë të kuptohet se çfarë po më pyesnit: Linq to XML. Mënyra XDocument ndihmon shumë. Megjithatë, shumica e kodeve që ne kemi shkruar tashmë më parë dhe përdorin një përzierje të çuditshme të pothuajse gjithçkaje që lidhet me .NET dhe XML. Unë jam duke pastruar në të paktën metodat e reja. 29.01.2014
  • Unë patjetër do të shkoj në rrugën e Linq2XML. Dhe aktualisht po provoj se si do të më ndihmojë në marrjen e ID-ve 29.01.2014

Përgjigjet:


1

Pra, ju duhet të merrni të gjitha ID-të, dhe kur dëshironi të shtoni një artikull të ri, duhet të kontrolloni nëse ekziston një artikull me ID-në e dhënë?

var idList = XDocument.Load("path")
                      .Descendants("ID")
                      .Select(x => (string)x);

if(idList.Contains(givenId))
{ 
    ...
}

Ose përdorni një HashSet për kërkim më të shpejtë:

 var hashSet = new HashSet<string>(idList);
 if(hashSet.Contains(givenId)) 
 {
    ...
 }
28.01.2014
  • Dhe nëse po ngarkoj XML si: var xmlDocument = new XmlDocument(); xmlDocument.Load(savefile); D.m.th., duke mos përdorur XDocument? 29.01.2014
  • mund ta bësh, por LINQ to XML është më i mirë dhe i lehtë për t'u përdorur 29.01.2014

  • 2

    Mund të përdorni HashSet për kërkim të shpejtë

    var ids = new HashSet<string>( 
                    XDocument.Load(filename)
                        .Descendants("ID")
                        .Select(x => (string)x));
    

    ose (duke përdorur klasën XmlDocument si në modifikimin tuaj).

    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(filename);
    var ids = new HashSet<string>(
                    xmlDocument.GetElementsByTagName("ID")
                        .Cast<XmlNode>()
                        .Select(x => x.InnerText));
    
    28.01.2014
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..