XML-ajout d'une nouvelle ligne
J'ai MS word doc enregistré comme .docx
. Je veux insérer une nouvelle ligne dans mon texte en éditant le fichier XML de docx. J'ai déjà essayé
,
,
,
amd il me donne toujours de l'espace pas une nouvelle ligne.
ce qu'il fait:
(code XML)
<w:t>hel
lo</w:t>
Quand j'ouvre .docx
le fichier alors qu'il est changé:
Hel lo
pas que je voulais être Hel
sur une ligne et lo
sur la ligne de secound.
3 réponses
<w:br/>
balise.
Je l'ai trouvé en créant un document Word, en le sauvegardant en XML (via Save As), en ajoutant un saut de ligne forcé avec Shift Enter, et j'ai vérifié le changement. La différence essentielle semble être juste l' w:br
balise, reflétant apparemment le code HTML br
balise.
dans le cas où il aide quelqu'un, le morceau suivant de code c# créera la structure XML multi-ligne
//Sets the text for a Word XML <w:t> node
//If the text is multi-line, it replaces the single <w:t> node for multiple nodes
//Resulting in multiple Word XML lines
private static void SetWordXmlNodeText(XmlDocument xmlDocument, XmlNode node, string newText)
{
//Is the text a single line or multiple lines?>
if (newText.Contains(System.Environment.NewLine))
{
//The new text is a multi-line string, split it to individual lines
var lines = newText.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
//And add XML nodes for each line so that Word XML will accept the new lines
var xmlBuilder = new StringBuilder();
for (int count = 0; count < lines.Length; count++)
{
//Ensure the "w" prefix is set correctly, otherwise docFrag.InnerXml will fail with exception
xmlBuilder.Append("<w:t xmlns:w=\"http://schemas.microsoft.com/office/word/2003/wordml\">");
xmlBuilder.Append(lines[count]);
xmlBuilder.Append("</w:t>");
//Not the last line? add line break
if (count != lines.Length - 1)
{
xmlBuilder.Append("<w:br xmlns:w=\"http://schemas.microsoft.com/office/word/2003/wordml\" />");
}
}
//Create the XML fragment with the new multiline structure
var docFrag = xmlDocument.CreateDocumentFragment();
docFrag.InnerXml = xmlBuilder.ToString();
node.ParentNode.AppendChild(docFrag);
//Remove the single line child node that was originally holding the single line text, only required if there was a node there to start with
node.ParentNode.RemoveChild(node);
}
else
{
//Text is not multi-line, let the existing node have the text
node.InnerText = newText;
}
}
le code ci-dessus va créer les noeuds enfant nécessaires et les retours de chariot, et prend soin du préfixe aussi bien.
basé sur la réponse de @Lenny ci-dessus, c'est ce qui fonctionne en utilisant Obj-C dans ma situation avec MS Word 2011 sur un Mac:
- (NSString *)setWordXMLText:(NSString *)str
{
NSString *newStr = @"";
// split the string into individual lines
NSArray *lines = [str componentsSeparatedByString: @"\n"];
if (lines.count > 1)
{
// add XML nodes for each line so that Word XML will accept the new lines
for (int count = 0; count < lines.count; count++)
{
newStr = [newStr stringByAppendingFormat:@"<w:t>%@</w:t>", lines[count]];
// Not the last line? add a line break
if (count != lines.count - 1)
{
newStr = [newStr stringByAppendingString:@"<w:br/>"];
}
}
return newStr;
}
else
{
return str;
}
}