2012-11-07 37 views
10

Mam zapisane słowo MS doc jako .docx. Chcę wstawić nową linię do mojego tekstu przez eddowanie pliku XML docx. Próbowałem już 
, 
, 
, 	, amd zawsze daje mi tylko przestrzeń, a nie nową linię.XML - dodawanie nowej linii

co robi:

(kod XML) <w:t>hel&#xA;lo</w:t>

Kiedy otwieram .docx plik to jest zmienione na:

Hel lo nie tak chciałem być Hel na jednej linii i lo na drugiej linii.

+0

próbowaliście robić zmienił się w słowie, a zbadanie różnic? –

+0

Tak, mam coś takiego jak ... ale muszę użyć kodu dla znaku nowej linii, ponieważ będę ładował dane z DB i wszystkie nazwy, które ładuję, chcą mieć każdy na nowej linii ... Mam nadzieję, że rozumiesz co mam na myśli –

+0

Naprawdę edytujesz pliki .docx? W jaki sposób? (Nie są XMLem jako takim, ale spakowanym XML). –

Odpowiedz

26

Użyj znacznika <w:br/>.

Znalazłem go, tworząc dokument Word, zapisując go jako XML (poprzez Save As), dodając wymuszoną linię podziału z Shift Enter i sprawdziłem zmianę. Zasadnicza różnica wydaje się być po prostu znacznikiem w:br, co najwyraźniej odzwierciedla znacznik HTML br.

+0

Uratowałeś mi dużo czasu! Thx za odpowiedź! –

+0

Może wydawać się oczywiste, ale to, co należy zrobić, to zastąpienie znacznika '' razem z '' ... – Sebas

2

W przypadku pomaga nikomu, następujący fragment kodu C# stworzy XML struktury wielo-liniowy

//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; 
    } 
} 

Powyższy kod stworzy niezbędne węzły potomne i powrotu karetki i dba o prefiksie także.

0

podstawie @ odpowiedź Lenny'ego powyżej, jest to, co działa używając obj-C w mojej sytuacji z MS Word 2011 na komputerze 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; 
    } 
}