Textformatierungen in XML-Dateien

Norbert

Moderator
Teammitglied
Leider kenne ich mich mit XML kaum aus und habe im Web auch nur einen Haufen Seiten und Dokus gefunden, wo geschwollen über "Wohlgeformtheit" und lauter so'n Quatsch disputiert wird. Dabei möchte ich nur ein paar total einfache Formatierungen in die angezeigten Texte einbauen. Nicht ein einziges simples Beispiel konnte ich dafür finden. Mit den mir bekannten html-Tags habe ich es schon versucht, aber das funktionierte leider nicht. Es soll ja wohl ab Excel 2003 möglich sein, sich solche Tabellen zu erstellen und im xml-Format abzuspeichern, ich hab aber nur Excel 2000, welches das noch nicht kann. Mit dem XML-Notepad 2007 bekomme ich das ebenfalls nicht hin.

Es geht mir nur um einfache Formatierungsmöglichkeiten, wie Farbgebung, Zeilenumbrüche und Zeilenabstand, optional auch Hervorhebungen und Schriftart.

Hier mal ein winziger Auszug aus meinem Modding Projekt, mit nur einer einzigen Tabellenzeile und 2 Spalten (sind insgesamt weit über 1000 Zeilen) als Beispiel.
Code:
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook
  xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
    <Author>[SNF]Norbert</Author>
    <Created>22.07.2010</Created>
    <LastSaved>11/2012</LastSaved>
    <Version>Mod 1.6 Alpha</Version>
  </DocumentProperties>
  <Worksheet ss:Name="user_strings">
    <Table>
      <Row>
        <Cell>
          <Data ss:Type="String">WELCOME_TO_THE_MOD</Data>
        </Cell>
        <Cell>
          [B]<Data ss:Type="String">[COLOR="mediumblue"]Willkommen zur Darkstar One Modifikation[/COLOR] *** VERSTECKTE CLUSTER V%1.%2 ***</Data>[/B]
        </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>

Es soll hier der Text der zweiten Zelle (= 2. Spalte) geändert werden, die erste bleibt so, wie sie ist (die erste Zelle dient dem Programm, welches diese Datei braucht, als ID für den eigentlichen Text in der zweiten Zelle).
Der blaue Teil soll farbig hervorgehoben werden, wünschenswert wäre auch die Möglichkeit, ihn fett, kursiv und/oder in einer anderen Schriftart als dem vorgegebenen Standard anzuzeigen. Dem soll dann ein Zeilenumbruch folgen, damit der zweite Teil in der nächsten Zeile angezeigt wird. Auch könnte ich in manchen Fällen einen größeren Abstand der Folgezeile brauchen (ca. halbe Zeilenhöhe, wie es in HTML z.B. mit dem <sub> </sub> Tag und anschließendem <br> möglich ist), um so einzelne Absätze besser voneinander zu trennen.

Ich vermute, dass alles in einer Zelle und evtl. sogar in nur einer Data-Zeile stehen muss, damit die Sache für meinen Fall funktioniert. Aber wie gesagt, hab ich da keine Ahnung, ob es so ist und würde auch andere Lösungsvorschläge ausprobieren.

Hätte da mal jemand eine einfache Lösung, wie das denn überhaupt geht?
Ein paar simple Beispiele zum Probieren wären auch nicht schlecht.

Danke im Voraus und Grüße,
Norbert
 
Hast du in deinem Excel 2000 das Compatibility Pack installiert, damit du xml lesen kannst? Meines
Wissens konnte das Standard Excel das nämlich noch nicht.

Wie auch immer, falls du mit deinem Excel ein Spreadsheet in xml schreiben kannst, könntest du in der
erzeugten Datei nachsehen, welche Tags Excel für die Formatierung verwendet.

In XML ist eben tatsächlich sehr wenig normiert. Das sind zum Beispiel die Parser-Direktiven und die Angabe der Namensräume.
Welche Elemente (Tags) der Erzeuger der Datei verwendet, können die Programmierer selber bestimmen. Sie müssen ja dafür sorgen,
dass der Parser die dann richtig umsetzt.

Falls der Parser von Excel 2000 sehr einfach gestrickt ist, werden eventuell nur die reinen Nutzdaten verarbeitet. Die Formatierungen
könnten verlorengehen.

Ich habe zum Erzeugen von Excel-Dateien (in Java) bisher immer Apache POI verwendet. Obwohl das MS-XML Format als Output auch
unterstützt wird, habe ich aber immer das binäre xls verwendet, da es deutlich schneller und mit weniger Speicherverbrauch ging.
 
Hallo duffguy, :)

das ist es ja leider gerade, obwohl das Compatibility Pack installiert ist, taucht der Dateityp xml im Öffnen/Speichern Dialog nicht auf. Ich hatte mich auch schon im Bekanntenkreis umgeschaut, aber keiner hat da eine neuere Excel-Version ab 2003. Nach entsprechenden Konvertern hatte ich ebenfalls gegoogelt, aber die kosten alle was und mit den sehr wenigen Testversionen hat's auch nicht funktioniert.

In XML ist eben tatsächlich sehr wenig normiert. Das sind zum Beispiel die Parser-Direktiven und die Angabe der Namensräume.
Welche Elemente (Tags) der Erzeuger der Datei verwendet, können die Programmierer selber bestimmen.
Wenn das so ist, dann könnte es sogar sein, dass alle Bemühungen für die Katz sind. Die xml-Datei kann nämlich nicht vom Programm direkt gelesen werden, sondern muss erst von einem den Modding Tools mitgelieferten primitiven Konverter in ein Ressourcenformat (.res) umgewandelt werden. Wenn dessen Parser keine Formatierungen kennt, bin ich halt angeschmiert. Dokumentiert ist jedenfalls diesbezüglich nichts, nur Ersetzungen innerhalb des Textes im Batch-Stil (%1 %2 usw.) sind beschrieben. Das es dennoch möglich ist, sehe ich ja an den vorhandenen Texten, die aber leider nur in eben diesem Ressourcenformat vorliegen. Auf mehrfaches Bitten an die Entwickler, mir auch die xml-Datei oder wenigstens ein Muster zukommen zu lassen, erhielt ich keinerlei Reaktion.

Aber wenigstens versuchen würde ich es gerne nochmal, vielleicht kann ja mal jemand ein xml-Muster hochladen oder in die Code-Box einfügen. Farbgebung und Zeilenumbruch würde als Minimum schon genügen. Falls nötig, kann ich auch ein einfaches Muster als xls-Arbeitsblatt hier hochladen.
 
Zuletzt bearbeitet:
Nur als Hinweis: LibreOffice (sicherlich auch OpenOffice) Calc kann im Excel2003XML-Format speichern.
libreoffice_calc_xml.jpg
 
Habe mal das Worksheet aus dem Screenshot im Excel2003 XML-Format gespeichert:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" 
					xmlns:html="http://www.w3.org/TR/REC-html40" 
					xmlns:o="urn:schemas-microsoft-com:office:office" 
					xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
					xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
					xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" 
					xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
					xmlns:x="urn:schemas-microsoft-com:office:excel">
	<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
		<Colors>
			<Color >
				<Index>3</Index>
				<RGB>#800000</RGB>
			</Color>
			<Color>
				<Index>4</Index>
				<RGB>#c0c0c0</RGB>
			</Color>
			<Color>
				<Index>5</Index>
				<RGB>#ff0000</RGB>
			</Color>
		</Colors>
	</OfficeDocumentSettings>
	<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
		<WindowHeight>9000</WindowHeight>
		<WindowWidth>13860</WindowWidth>
		<WindowTopX>240</WindowTopX>
		<WindowTopY>75</WindowTopY>
		<ProtectStructure>False</ProtectStructure>
		<ProtectWindows>False</ProtectWindows>
	</ExcelWorkbook>
	<Styles>
		<Style ss:ID="Default" ss:Name="Default"/>
		<Style ss:ID="Result" ss:Name="Result">
			<Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/>
		</Style>
		<Style ss:ID="Result2" ss:Name="Result2">
			<Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/>
			<NumberFormat ss:Format="Currency"/>
		</Style>
		<Style ss:ID="Heading" ss:Name="Heading">
			<Font ss:Bold="1" ss:Italic="1" ss:Size="16"/>
		</Style>
		<Style ss:ID="Heading1" ss:Name="Heading1">
			<Font ss:Bold="1" ss:Italic="1" ss:Size="16"/>
		</Style>
		<Style ss:ID="co1"/>
		<Style ss:ID="co2"/>
		<Style ss:ID="co3"/>
		<Style ss:ID="ta1"/>
		<Style ss:ID="ce1"/>
		<Style ss:ID="ce2">
			<Font ss:Color="#800000"/>
		</Style>
		<Style ss:ID="ta_extref"/>
	</Styles>
	<ss:Worksheet ss:Name="Tabelle1">
		<Table ss:StyleID="ta1">
			<Column ss:Width="133.852"/>
			<Column ss:Width="103.9465"/>
			<Row ss:Height="12.8409">
				<Cell>
					<Data ss:Type="String">Zelle A1 ohne Formatierung</Data>
				</Cell>
				<Cell ss:Index="2"/>
			</Row>
			<Row ss:Height="12.8409">
				<Cell ss:Index="2"/>
			</Row>
			<Row ss:Height="12.8409">
				<Cell ss:StyleID="ce1">
					<Data ss:Type="String">A3 fett formatiert</Data>
				</Cell>
				<Cell ss:StyleID="ce2">
					<Data ss:Type="String">B3 mit der Farbe Rot</Data>
				</Cell>
			</Row>
		</Table>
		<x:WorksheetOptions/>
	</ss:Worksheet>
	<ss:Worksheet ss:Name="Tabelle2">
		<Table ss:StyleID="ta1">
			<Column ss:Width="64.2614"/>
			<Row ss:Height="12.8409">
				<Cell ss:Index="1"/>
			</Row>
		</Table>
		<x:WorksheetOptions/>
	</ss:Worksheet>
	<ss:Worksheet ss:Name="Tabelle3">
		<Table ss:StyleID="ta1">
			<Column ss:Width="64.2614"/>
			<Row ss:Height="12.8409">
				<Cell ss:Index="1"/>
			</Row>
		</Table>
		<x:WorksheetOptions/>
	</ss:Worksheet>
</Workbook>

Wie ich vermutet hatte, werden die Formatierungen als CSS-ähnliche Verweise behandelt. @Norbert: Teste mal, ob du sowas einlesen kannst.

hth
 

Anhänge

  • formate.png
    formate.png
    25 KB · Aufrufe: 311
Tja, das lässt sich zwar ohne Fehlermeldung von meinem popeligen Konverter ins res-Format umwandeln, zeigt jedoch leider keinerlei Auswirkungen im Programm. Ich habe dazu dein schönes Muster (Kopf mit den Styles usw.) in meine große xml-Datei übernommen und erstmal nur den Text einer Zelle farblich mit <Cell ss:StyleID="ce2"> bunt formatiert... äh... formatieren wollen. Nix, bleibt bei der Textausgabe weiß.

Ich fürchte, dass der Konverter die Styles ignoriert. Hab ihn jetzt mal "innen" näher unter die Lupe genommen und kann auf den ersten Blick nichts von Formatierungsmöglichkeiten entdecken. Lediglich simple Lesebefehle der rohen Tabellendaten (Texte in den Zellen, Zeilen, Spalten) scheinen da drin zu existieren. So ein Mist. Möglicherweise hatten die Entwickler einen ganz anderen Konverter verwendet, den die Säcke nicht raus rücken.

Naja, ich werde damit noch eine Weile experimentieren, vielleicht liegt der Fehler ja auch bei mir.
Jedenfalls danke ich dir ganz herzlich für deine Mühe. :)(y)
Auch wenn sich kein Erfolg einstellen sollte, dann weiß ich dadurch wenigstens, dass es so nicht geht und kann mir die Zeit mit weiteren sinnlosen Versuchen sparen.
 
Oben