Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Iterera igenom XMLDocument

Postades av 2005-06-08 14:08:08 - Anders Bengtsson, i forum xml, Tråden har 5 Kommentarer och lästs av 1310 personer

I XML filen nedan finns Word.Bookmark.Start
Det jag vill är att man ska kunna loopa igenom XMLDocumentet och hitta alla bokmärkena och sen
ändra texten som står i det bokmärket. I detta fallet står det "TEXTEN" och bokmärket heter MyBOOKMARK.

Kan någon hjälpa mig hur jag ska iterera igenom mitt XMLDocument för att hitta dessa.
Har försökt men hittar inte det.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?mso-application progid="Word.Document"?>
- <w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve">
+ <o:DocumentProperties>
+ <w:fonts>
+ <w:styles>
+ <w:docPr>
- <w:body>
- <wx:sect>
<aml:annotation aml:id="0" w:type="Word.Bookmark.Start" w:name="MyBOOKMARK" />
- <w:p>
- <w:r>
<w:t>TEXTEN</w:t>
</w:r>
<aml:annotation aml:id="0" w:type="Word.Bookmark.End" />
</w:p>
- <w:sectPr>
<w:pgSz w:w="11906" w:h="16838" />
<w:pgMar w:top="1417" w:right="1417" w:bottom="1417" w:left="1417" w:header="708" w:footer="708" w:gutter="0" />
<w:cols w:space="708" />
<w:docGrid w:line-pitch="360" />
</w:sectPr>
</wx:sect>
</w:body>
</w:wordDocument>


Svara

Sv: Iterera igenom XMLDocument

Postades av 2005-06-08 23:10:36 - Andreas Paulsson

Jag gjorde liknande sak för ett tag sedan då jag hade ett program (yafray) som hade filformat som var XML och jag behövde göra varianter (några hundra åt gången) av en i förväg genererad XML-fil fast med vissa värden utbytta.

Jag gjorde då ett litet program i C# som använde XPath för att hitta de noder som jag sedan skulle ändra värden i. Att skriva XPath-queries kan dock vara något knivigt, men jag använde Visual XPath (se http://weblogs.asp.net/nleghari/articles/visualxpath.aspx ) för att bygga upp XPath-uttrycken (Visual XPath kan även generera viss skelett-kod i C# har jag för mig).

Förmodligen går detta även att lösa med xslt, men det har jag inte gjort (i det fallet som jag gjorde så läste jag de nya värdena från en databas, så C#-lösningen var enklast).

Som kommentar kan jag sedan säga att det du gör är ännu enklare om du gör det med ett macro i Word (men det kanske inte är tillgängligt där du kör programmet?). Att ersätta kod i bokmärken är busenkelt i ett macro i MS Word.

/Andreas


Svara

Sv: Iterera igenom XMLDocument

Postades av 2005-06-09 10:06:59 - Tomas Johansson

Exemplet ovan var i.o.f.s. kort (med endast ett bokmärke) och när det gäller aktuella XML-scheman så verkar det som om man måste ladda ner och installera "Office 2003: XML Reference Schemas" för att kunna få se dem... och det orkar jag inte, så jag gissar hur strukturen ska se ut m.h.a. exemplet ovan.

Om den generella strukturen är att ett bokmärke alltid ska definieras av ett annotation-element efterföljd med en /p/r/t -struktur, så tror jag att följande XPath-uttryck ska fungera för att erhålla en nodlista med w:t-elementen
//aml:annotation[@w:type='Word.Bookmark.Start']/following-sibling::w:p/w:r/w:t

C#-kod för att ändra innehållet i "w:t -elementen":

XmlDocument oXmlDocument = new XmlDocument();
oXmlDocument.Load(filnamn);
XmlNamespaceManager nm = new XmlNamespaceManager(oXmlDocument.NameTable);
nm.AddNamespace("w", "http://schemas.microsoft.com/office/word/2003/wordml");
nm.AddNamespace("aml", "http://schemas.microsoft.com/aml/2001/core");
XmlNodeList oXmlNodeList = oXmlDocument.SelectNodes("//aml:annotation[@w:type='Word.Bookmark.Start']/following-sibling::w:p/w:r/w:t", nm);
for(int i=0; i<oXmlNodeList.Count; i++)
{
oXmlNodeList[i].InnerText = "det nya värdet på w:t-elementet";
}
oXmlDocument.Save(nyttfilnamn);

/ Tomas


Svara

Sv:Iterera igenom XMLDocument

Postades av 2005-06-10 08:59:01 - Anders Bengtsson

Tackar Tomas

Men hur kollar jag vad mitt bokmärke heter för jag ska ju ersätta texten olika beroende på vad bokmärket heter.


Svara

Sv: Iterera igenom XMLDocument

Postades av 2005-06-10 12:56:17 - Tomas Johansson

I så fall är det antaligen enklast att istället selektera de annotation-element där ett bokmärke börjar:
//aml:annotation[@w:type='Word.Bookmark.Start']
och sedan kan du plocka ut värdet på attributet "w:name" och lagra den i en variabel, och sedan gå framåt (med vanlig C#-kod) tills du hamnar i "w:p" och sedan gå ner i den tills du får en referens till "w:t" så att du kan ändra värdet till det som du sparade i variabeln.
Den XmlNodeList som returneras av SelectNodes-metoden innehåller XmlNode-element, och den klassen finns dokumenterad här:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemxmlxmlnodememberstopic.asp
och där finns properties som kan användas för att navigera framåt och neråt bland xml-elementen.

/ Tomas


Svara

Sv:Iterera igenom XMLDocument

Postades av 2005-06-14 10:05:18 - Anders Bengtsson

Tror jag är lite fel ute för det blev inte riktigt rätt. Ändrade så jag går mot annotation-elementen.
Men tror jag gör stegar igenom den fel sen. Värdet ersätts visserligen nu, men när jag ska öppna den i word så finns inget där.

<Code>
XmlDocument oXmlDocument = new XmlDocument();
oXmlDocument.Load(filePath);
XmlNamespaceManager nm = new XmlNamespaceManager(oXmlDocument.NameTable);
nm.AddNamespace("w", "http://schemas.microsoft.com/office/word/2003/wordml");
nm.AddNamespace("aml", "http://schemas.microsoft.com/aml/2001/core");
XmlNodeList oXmlNodeList = oXmlDocument.SelectNodes("//aml:annotation[@w:type='Word.Bookmark.Start']", nm);
for (int i = 0; i < oXmlNodeList.Count; i++)
{

foreach (XmlAttribute xa in oXmlNodeList[i].Attributes)
{
string BookmarkName ="";

if (xa.Name == "w:name")
{
BookmarkName = xa.InnerText;
if(BookmarkName == "MyBookmark")
{
if (oXmlNodeList[i].NextSibling.Name == "w:p")
oXmlNodeList[i].NextSibling.InnerText = "nytt värde";
}
if(BookmarkName == "MyBookmark2")
{
if (oXmlNodeList[i].NextSibling.Name == "w:p")
oXmlNodeList[i].NextSibling.InnerText = "nytt värde2";
}

}


}

}
</code>


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 574
27 958
271 741
5 818
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies