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.

10
demandé sur Kara 2012-11-07 17:17:06

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.

26
répondu Jukka K. Korpela 2012-11-07 13:55:59

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.

2
répondu Lenny 2015-01-16 12:32:29

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;
    }
}
0
répondu ghr 2017-06-17 08:49:32