wxString tmp;
     if (GetPropVal(propName, &tmp))
         return tmp;
-    else
-        return defaultVal;
+
+    return defaultVal;
 }
 
 void wxXmlNode::AddChild(wxXmlNode *child)
         return str;
     }
     else
-        return wxString(s, len);
+        return wxString(s, len != wxSTRING_MAXLEN ? len : strlen(s));
 #endif
 }
 
 
 // write string to output:
 inline static void OutputString(wxOutputStream& stream, const wxString& str,
-                                wxMBConv *convMem, wxMBConv *convFile)
+#if wxUSE_UNICODE
+    wxMBConv * WXUNUSED(convMem),
+#else
+    wxMBConv *convMem,
+#endif
+    wxMBConv *convFile)
 {
     if (str.IsEmpty()) return;
 #if wxUSE_UNICODE
 // Same as above, but create entities first.
 // Translates '<' to "<", '>' to ">" and '&' to "&"
 static void OutputStringEnt(wxOutputStream& stream, const wxString& str,
-                            wxMBConv *convMem, wxMBConv *convFile)
+                            wxMBConv *convMem, wxMBConv *convFile,
+                            bool escapeQuotes = false)
 {
     wxString buf;
     size_t i, last, len;
     {
         c = str.GetChar(i);
         if (c == wxT('<') || c == wxT('>') ||
-            (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;")))
+            (c == wxT('&') && str.Mid(i+1, 4) != wxT("amp;")) ||
+            (escapeQuotes && c == wxT('"')))
         {
             OutputString(stream, str.Mid(last, i - last), convMem, convFile);
             switch (c)
                 case wxT('&'):
                     OutputString(stream, wxT("&"), NULL, NULL);
                     break;
+                case wxT('"'):
+                    OutputString(stream, wxT("""), NULL, NULL);
+                    break;
                 default: break;
             }
             last = i + 1;
             prop = node->GetProperties();
             while (prop)
             {
-                OutputString(stream, wxT(" ") + prop->GetName() +
-                             wxT("=\"") + prop->GetValue() + wxT("\""),
+                OutputString(stream, wxT(" ") + prop->GetName() +  wxT("=\""),
                              NULL, NULL);
-                // FIXME - what if prop contains '"'?
+                OutputStringEnt(stream, prop->GetValue(), NULL, NULL,
+                                true/*escapeQuotes*/);
+                OutputString(stream, wxT("\""), NULL, NULL);
                 prop = prop->GetNext();
             }