Dopisanie wiersza do pliku opf(xml)

0

Witam, jestem początkującym w .NET MVC stąd może i proste pytanie, a może i nie proste... Mam potrzebę, dopisania do pliku opf(wygląda jak zwykły xml ), jednego wiersza

Plik ma strukturę mniej więcej :

<?xml version="1.0"  encoding="UTF-8"?>
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
</metadata>
<manifest>
    <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/>
    <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css"/>
    <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf"/>
    <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype"/>
</manifest>

potrzebuję do niego, w tagu <manifest> dopisać jeden wiersz:

 <item href="msg.txt" id="msg" media-type="application/text"/>

Teraz pytanie czy poprawnie się do tego zabieram. Proszę o ewentualne poprawienie moich błędów.

  Ionic.FileSelector opfFilesSelector = new Ionic.FileSelector("name = '*.opf'");
            var opfFilesSelector = opfFilesSelector.SelectFiles(this.path, true);


   //dopisanie do manifest
    using (StreamReader sr = new StreamReader(opfFilesSelector))
    {
        string fileBody = sr.ReadToEnd();

        //szukam pozycji <manifest>
        int markPosition = fileBody.IndexOf("<manifest>");

        sr.Close();
        if (markPosition >= 0)
        {
            using (StreamWriter w = new StreamWriter(opfFilesSelector, false))
            {
                string xml = "<item href="msg.txt" id="msg" media-type="application / text"/>"
                w.Write(xml);
                w.Close();
            }
        }
    }
1

XML nie jest poprawny ale zgaduję że to błąd przy wycinaniu. Więc załóżmy że mamy taki XML:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml" />
   <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css" />
   <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf" />
   <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype" />
</manifest>

I teraz najlepiej użyć xDocument lub Serializacji, jako że chcesz dodać tylko jeden element to z XDocument będzie szybciej:

var xml = "<?xml version=\"1.0\"  encoding=\"UTF-8\"?>" +
            "<manifest>" +
            "    <item href=\"toc.ncx\" id=\"ncx\" media-type=\"application/x-dtbncx+xml\"/>" +
            "    <item href=\"Styles/PozaBlekitem_oryginal.css\" id=\"PozaBlekitem_oryginal.css\" media-type=\"text/css\"/>" +
            "    <item href=\"Fonts/Calibri.ttf\" id=\"Calibri.ttf\" media-type=\"application/x-font-ttf\"/>" +
            "    <item href=\"Fonts/MinionPro-Bold.otf\" id=\"MinionPro-Bold.otf\" media-type=\"application/vnd.ms-opentype\"/>" +
            "</manifest>";

var newElement = new XElement("item");
newElement.Add(new XAttribute("href", "msg.txt"));
newElement.Add(new XAttribute("id", "msg"));
newElement.Add(new XAttribute("media-type", "application/text"));

var xDocument = XDocument.Parse(xml);
var manifestElement = xDocument.Element("manifest");
manifestElement.Add(newElement);
Console.WriteLine(xDocument.ToString());

Output:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml" />
   <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css" />
   <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf" />
   <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype" />
   <item href="msg.txt" id="msg" media-type="application/text" />
</manifest>
0

Poprawiłem trochę. Czy to ma sens ?

            Ionic.FileSelector filesSelector = new Ionic.FileSelector("name = '*.opf'");
            var opfFileSelector = filesSelector.SelectFiles(this.path, true);

            if (opfFileSelector.Count > 0)
            {
                foreach (var opfFile in opfFileSelector)
                {
                    try
                    {
                        //dopisanie do manifest
                        using (StreamReader sr = new StreamReader(opfFile))
                        {
                            string fileBody = sr.ReadToEnd();

                            //szukam pozycji <manifest>
                            int markPosition = fileBody.IndexOf("<manifest>");

                            sr.Close();
                            if (markPosition >= 0)
                            {
                                using (StreamWriter w = new StreamWriter(opfFile, false))
                                {
                                    string xml = "<item href="msg.txt" id="msg" media-type="application / text"/>"
                                    w.Write(xml);
                                    w.Close();
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        log.Error("addedItemMsg, opfFile - " + opfFile + " - Exception: " + e.Message);
                    }
                }
            }
0
DibbyDum napisał(a):

XML nie jest poprawny ale zgaduję że to błąd przy wycinaniu. Więc załóżmy że mamy taki XML:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml" />
   <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css" />
   <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf" />
   <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype" />
</manifest>

I teraz najlepiej użyć xDocument lub Serializacji, jako że chcesz dodać tylko jeden element to z XDocument będzie szybciej:

var xml = "<?xml version=\"1.0\"  encoding=\"UTF-8\"?>" +
            "<manifest>" +
            "    <item href=\"toc.ncx\" id=\"ncx\" media-type=\"application/x-dtbncx+xml\"/>" +
            "    <item href=\"Styles/PozaBlekitem_oryginal.css\" id=\"PozaBlekitem_oryginal.css\" media-type=\"text/css\"/>" +
            "    <item href=\"Fonts/Calibri.ttf\" id=\"Calibri.ttf\" media-type=\"application/x-font-ttf\"/>" +
            "    <item href=\"Fonts/MinionPro-Bold.otf\" id=\"MinionPro-Bold.otf\" media-type=\"application/vnd.ms-opentype\"/>" +
            "</manifest>";

var newElement = new XElement("item");
newElement.Add(new XAttribute("href", "msg.txt"));
newElement.Add(new XAttribute("id", "msg"));
newElement.Add(new XAttribute("media-type", "application/text"));

var xDocument = XDocument.Parse(xml);
var manifestElement = xDocument.Element("manifest");
manifestElement.Add(newElement);
Console.WriteLine(xDocument.ToString());

Output:

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
   <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml" />
   <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css" />
   <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf" />
   <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype" />
   <item href="msg.txt" id="msg" media-type="application/text" />
</manifest>

Tutaj podałeś na sztywno xml-a a czy mogę zrobić tak jak napisałem wyżej że wyszukam wszystkich plików opf.
i w pętli pododaje itemy ? czyli :

 Ionic.FileSelector filesSelector = new Ionic.FileSelector("name = '*.opf'");
            var opfFileSelector = filesSelector.SelectFiles(this.path, true);
 
            if (opfFileSelector.Count > 0)
            {
                foreach (var opfFile in opfFileSelector)
                {
                    try
                    {
var newElement = new XElement("item");
newElement.Add(new XAttribute("href", "msg.txt"));
newElement.Add(new XAttribute("id", "msg"));
newElement.Add(new XAttribute("media-type", "application/text"));
 
var xDocument = XDocument.Parse(opfFile );
var manifestElement = xDocument.Element("manifest");
manifestElement.Add(newElement);
Console.WriteLine(xDocument.ToString());

                      }
                    catch (Exception e)
                    {
                        log.Error("addedItemMsg, opfFile - " + opfFile + " - Exception: " + e.Message);
                    }
                }
            }
0

Możesz podać plik, zamiast XDocument.Parse użyj XDocument.Load.

0

Wszystko idzie w porządku do momentu kiedy chce dodać nowy element :

 
var manifestElement = xDocument.Element("manifest");
manifestElement.Add(newElement);

otrzymuje :

{"Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu."}

0
var manifestElement = xDocument.Descendants("manifest").First();

Znajdzie wszystkie elementy manifest i weźmie pierwszy. Teraz dostałeś nulla bo oryginalny XML wygląda inaczej więc nie znalazł manifest jak pierwszy element.
Descendants znajdzie wszystkie wystąpienia w całym XMLu.

0

Ach kuźwa!... Sory za banalną pomyłke. Przecież pierwszym elementem jest <metadata>...

0

sekwencja nie zawiera elementów....

0

Kurde nie wiem... Czy ten xml jest nie poprawny czy co...

<?xml version="1.0"  encoding="UTF-8"?>
<package xmlns="http://www.somethinglink.org" unique-identifier="bookid" version="2.0">
  <metadata xmlns:dc="http://eements/1.1/">
    <dc:creator xmlns:ns0="http://www.somethinglink.org" ns0:role="aut" ns0:file-as="Nuno Gomes, Olo Sawa">Nuno Gomes, Olo Sawa</dc:creator>
<dc:identifier id="bookid">urn:uuid:29d919dd-24f5-4384-be78-b447c9dc299b</dc:identifier>
    <dc:title>Poza błękitem. Autobiografia</dc:title>
    <dc:identifier xmlns:opf="http://www.somethinglink.org" opf:scheme="ISBN">9788362827268</dc:identifier>
    <dc:publisher>Mayfly Sp. z o.o.</dc:publisher>
    <dc:description>&lt;p class="description"&gt;Jeden człin spędzonych pod wodą. Nurkowanie, w którym liczy się perfekcyjny plan i maksymalna osiągalna dla człowieka głębokość. Nurkowanie, które jest sensem życia. Przez biografię Nuna Gomesa przewijają się najciekawsze postaci nurkowego świata - niedościgły Sheck Exley, wytrwały Jim Bowden, nieustraszony John Bennett - ale też znakomici polscy nurkowie, dla których udział w przedsięwzięciach Nuna był początkiem ich własnej kariery nurkowej. Opowieści Nuna zabierają czytelnika do zmagającej się z AIDS i przemocą Republiki Południowej Afryki, do będącego niegdyś kwitnącym ośrodkiem nurkowym Dahabu i do Lizbony z czasów dzieciństwa autora, pozwalając zrozumieć drogę, która zaprowadziła Nuna Gomesa do dwóch światowych rekordów głębokości.&lt;/p&gt;</dc:description>
    <meta content="Adobe InDesign" name="generator"/>
    <meta content="0.7.4" name="Sigil version"/>
    <dc:date xmlns:opf="http://www.somethinglink.org">0100-12-31T23:00:00+00:00</dc:date>
    <meta content="Poza błękitem. Autobiografia" name="calibre:title_sort"/>
    <meta content="0.0" name="calibre:rating"/>
    <dc:contributor xmlns:ns1="http://www.somethinglink.org" ns1:role="bkp">calibre (0.9.30) [http://calibre-ebook.com]</dc:contributor>
    <meta content="{}" name="calibre:user_categories"/>
    <meta content="{&quot;Nuno Gomes, Olo Sawa&quot;: &quot;&quot;}" name="calibre:author_link_map"/>
    <dc:date xmlns:opf="http://www.somethinglink.org" opf:event="modification">2015-05-27</dc:date>
    <dc:language>pl</dc:language>
<dc:identifier xmlns:ns1="http://www.somethinglink.org" ns1:scheme="calibre">c42cf8d1-9c08-45-0bb06e4c1127</dc:identifier>
</metadata>
  <manifest>
    <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/>
    <item href="Styles/PozaBlekitem_oryginal.css" id="PozaBlekitem_oryginal.css" media-type="text/css"/>
    <item href="Fonts/Calibri.ttf" id="Calibri.ttf" media-type="application/x-font-ttf"/>
    <item href="Fonts/MinionPro-Bold.otf" id="MinionPro-Bold.otf" media-type="application/vnd.ms-opentype"/>
    <item href="Fonts/MinionPro-It.otf" id="MinionPro-It.otf" media-type="application/vnd.ms-opentype"/>
    <item href="Fonts/MinionPro-Regular.otf" id="MinionPro-Regular.otf" media-type="application/vnd.ms-opentype"/>
    <item href="Fonts/OCRB10EUNormal.TTF" id="OCRB10EUNormal.TTF" media-type="application/x-font-ttf"/>
    <item href="Fonts/TimesNewRomanPSMT.ttf" id="TimesNewRomanPSMT.ttf" media-type="application/x-font-ttf"/>
    <item href="Images/GuinnessCertyfikat_fmt.jpeg" id="GuinnessCertyfikat_fmt.jpeg" media-type="image/jpeg"/>
    <item href="Images/ThirdClassDiver_fmt.jpeg" id="ThirdClassDiver_fmt.jpeg" media-type="image/jpeg"/>
    <item href="Text/Cytaty.xhtml" id="Cytaty.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Tytul.xhtml" id="Tytul.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/PrawaAutorskie.xhtml" id="PrawaAutorskie.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Dedykacja.xhtml" id="Dedykacja.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Prolog.xhtml" id="Prolog.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/1_t.xhtml" id="x1_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/P_t.xhtml" id="P_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/1.xhtml" id="x1.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/2.xhtml" id="x2.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/2_t.xhtml" id="x2_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/3.xhtml" id="x3.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/3_t.xhtml" id="x3_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/4.xhtml" id="x4.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/BadanieBoesmansgat.jpg" id="BadanieBoesmansgat.jpg" media-type="image/jpeg"/>
    <item href="Images/JaskiniaHarasib.jpg" id="JaskiniaHarasib.jpg" media-type="image/jpeg"/>
    <item href="Text/4_t.xhtml" id="x4_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/5.xhtml" id="x5.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/5_t.xhtml" id="x5_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/6.xhtml" id="x6.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/6_t.xhtml" id="x6_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/7.xhtml" id="x7.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/7_t.xhtml" id="x7_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/8.xhtml" id="x8.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/7_Ahmed.xhtml" id="x7_Ahmed.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/P.jpg" id="P.jpg" media-type="image/jpeg"/>
    <item href="Images/M.jpg" id="M.jpg" media-type="image/jpeg"/>
    <item href="Images/W.jpg" id="W.jpg" media-type="image/jpeg"/>
    <item href="Text/8_t.xhtml" id="x8_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Tabela1.xhtml" id="Tabela1.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/T1_t.xhtml" id="T1_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/T2_t.xhtml" id="T2_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Tabela3.xhtml" id="Tabela3.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/Tabela2.xhtml" id="Tabela2.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/T3_t.xhtml" id="T3_t.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z1.xhtml" id="z1.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/1.jpg" id="x1.jpg" media-type="image/jpeg"/>
    <item href="Images/2.jpg" id="x2.jpg" media-type="image/jpeg"/>
    <item href="Images/3.jpg" id="x3.jpg" media-type="image/jpeg"/>
    <item href="Images/4.jpg" id="x4.jpg" media-type="image/jpeg"/>
    <item href="Images/5.jpg" id="x5.jpg" media-type="image/jpeg"/>
    <item href="Images/6.jpg" id="x6.jpg" media-type="image/jpeg"/>
    <item href="Images/7.jpg" id="x7.jpg" media-type="image/jpeg"/>
    <item href="Images/8.jpg" id="x8.jpg" media-type="image/jpeg"/>
    <item href="Text/z2.xhtml" id="z2.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z3.xhtml" id="z3.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z4.xhtml" id="z4.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z5.xhtml" id="z5.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z6.xhtml" id="z6.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z7.xhtml" id="z7.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/z8.xhtml" id="z8.xhtml" media-type="application/xhtml+xml"/>
    <item href="Text/SpisTresci.xhtml" id="SpisTresci.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/G.jpg" id="G.jpg" media-type="image/jpeg"/>
    <item href="Images/statek.jpg" id="statek.jpg" media-type="image/jpeg"/>
    <item href="Text/OkladkaI.xhtml" id="OkladkaI.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/PozaBlekitem_OkladkaI.jpg" id="PozaBlekitem_OkladkaI.jpg" media-type="image/jpeg"/>
    <item href="Text/OkladkaIV.xhtml" id="OkladkaIV.xhtml" media-type="application/xhtml+xml"/>
    <item href="Images/PozaBlekitem_OkladkaIV.jpg" id="PozaBlekitem_OkladkaIV.jpg" media-type="image/jpeg"/>
	  <item href="toc.ncx" id="ncx" media-type="application/x-dtbncx+xml"/>
  </manifest>
  <spine toc="ncx">
    <itemref idref="OkladkaI.xhtml"/>
    <itemref idref="Cytaty.xhtml"/>
    <itemref idref="Tytul.xhtml"/>
    <itemref idref="PrawaAutorskie.xhtml"/>
    <itemref idref="Dedykacja.xhtml"/>
    <itemref idref="SpisTresci.xhtml"/>
    <itemref idref="Prolog.xhtml"/>
    <itemref idref="P_t.xhtml"/>
    <itemref idref="x1.xhtml"/>
    <itemref idref="x1_t.xhtml"/>
    <itemref idref="z1.xhtml"/>
    <itemref idref="x2.xhtml"/>
    <itemref idref="x2_t.xhtml"/>
    <itemref idref="z2.xhtml"/>
    <itemref idref="x3.xhtml"/>
    <itemref idref="x3_t.xhtml"/>
    <itemref idref="z3.xhtml"/>
    <itemref idref="x4.xhtml"/>
    <itemref idref="x4_t.xhtml"/>
    <itemref idref="z4.xhtml"/>
    <itemref idref="x5.xhtml"/>
    <itemref idref="x5_t.xhtml"/>
    <itemref idref="z5.xhtml"/>
    <itemref idref="x6.xhtml"/>
    <itemref idref="x6_t.xhtml"/>
    <itemref idref="z6.xhtml"/>
    <itemref idref="x7.xhtml"/>
    <itemref idref="x7_Ahmed.xhtml"/>
    <itemref idref="x7_t.xhtml"/>
    <itemref idref="z7.xhtml"/>
    <itemref idref="x8.xhtml"/>
    <itemref idref="x8_t.xhtml"/>
    <itemref idref="z8.xhtml"/>
    <itemref idref="Tabela1.xhtml"/>
    <itemref idref="T1_t.xhtml"/>
    <itemref idref="Tabela2.xhtml"/>
    <itemref idref="T2_t.xhtml"/>
    <itemref idref="Tabela3.xhtml"/>
    <itemref idref="T3_t.xhtml"/>
    <itemref idref="OkladkaIV.xhtml"/>
  </spine>
  <guide/>
</package>
1

To przez to że nie podajesz w jakim "namespace" to jest, przykład:

XNamespace xNamespace = "http://www.somethinglink.org";
var newElement = new XElement(xNamespace + "item");
newElement.Add(new XAttribute("href", "msg.txt"));
newElement.Add(new XAttribute("id", "msg"));
newElement.Add(new XAttribute("media-type", "application/text"));

var xDocument = XDocument.Parse(xml);
var manifestElement = xDocument.Descendants(xNamespace + "manifest")
                                 .First();
manifestElement.Add(newElement);
Console.WriteLine(xDocument.ToString());
0
DibbyDum napisał(a):

To przez to że nie podajesz w jakim "namespace" to jest, przykład:

XNamespace xNamespace = "http://www.somethinglink.org";
var newElement = new XElement(xNamespace + "item");
newElement.Add(new XAttribute("href", "msg.txt"));
newElement.Add(new XAttribute("id", "msg"));
newElement.Add(new XAttribute("media-type", "application/text"));

var xDocument = XDocument.Parse(xml);
var manifestElement = xDocument.Root.DescendantsAndSelf(xNamespace + "manifest")
                                 .First();
manifestElement.Add(newElement);
Console.WriteLine(xDocument.ToString());

a nie na odwrót przed ostatnia linijka ?

 newElement.Add(manifestElement);
0

błąd.jpg
po prostu daje taki błąd.

0

Źle przekopiowałeś w linijce var manifestElement = xDocument.Root.DescendantsAndSelf(xNamespace + "manifest") zapomniałeś dodać na końcu .First();

1 użytkowników online, w tym zalogowanych: 0, gości: 1