diff --git a/.travis.yml b/.travis.yml
index 6c8e347..9b80df5 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,10 +15,6 @@ matrix:
     - os: linux
       python: "3.6"
 
-    - os: osx
-      language: generic
-      env:
-        - OSXENV=3.5.0
     - os: osx
       language: generic
       env:
diff --git a/odml/tools/version_converter.py b/odml/tools/version_converter.py
index 47539cb..86e4011 100644
--- a/odml/tools/version_converter.py
+++ b/odml/tools/version_converter.py
@@ -52,6 +52,9 @@ class VersionConverter(object):
             if elem in doc:
                 doc = doc.replace(elem, val)
 
+        # Make sure encoding is present for the xml parser
+        doc = doc.encode('utf-8')
+
         # Make pretty print available by resetting format
         parser = ET.XMLParser(remove_blank_text=True)
         tree = ET.ElementTree(ET.fromstring(doc, parser))
@@ -300,7 +303,7 @@ class VersionConverter(object):
 
                 if value.text:
                     if main_val.text:
-                        main_val.text += ", " + value.text.strip()
+                        main_val.text += "," + value.text.strip()
                         multiple_values = True
                     else:
                         main_val.text = value.text.strip()
diff --git a/odml/tools/xmlparser.py b/odml/tools/xmlparser.py
index 1a4f240..4a04e23 100644
--- a/odml/tools/xmlparser.py
+++ b/odml/tools/xmlparser.py
@@ -27,11 +27,15 @@ except NameError:
 
 
 def to_csv(val):
-    unicode_values = list(map(unicode, val))
+    # Make sure all individual values do not contain
+    # leading or trailing whitespaces.
+    unicode_values = list(map(unicode.strip, map(unicode, val)))
     stream = StringIO()
     writer = csv.writer(stream, dialect="excel")
     writer.writerow(unicode_values)
-    csv_string = stream.getvalue().strip()
+    # Strip any csv.writer added carriage return line feeds
+    # and double quotes before saving.
+    csv_string = stream.getvalue().strip().strip('"')
     if len(unicode_values) > 1:
         csv_string = "[" + csv_string + "]"
     return csv_string
@@ -40,8 +44,14 @@ def to_csv(val):
 def from_csv(value_string):
     if not value_string:
         return []
-    if value_string[0] == "[":
+    if value_string[0] == "[" and value_string[-1] == "]":
         value_string = value_string[1:-1]
+    else:
+        # This is a single string entry, any comma contained
+        # is part of the value and must not be used to
+        # split up the string.
+        return [value_string]
+
     if not value_string:
         return []
     stream = StringIO(value_string)

VersionConverter encoding problem
With Python3, the VersionConverter encounters a `ValueError: Unicode strings with encoding declaration are not supported` when the xml tag of the to be converted file contains the `encoding="UTF-8"` attribute.
diff --git a/test/test_version_converter.py b/test/test_version_converter.py
index 48b248e..29c28ab 100644
--- a/test/test_version_converter.py
+++ b/test/test_version_converter.py
@@ -130,7 +130,7 @@ class TestVersionConverter(unittest.TestCase):
         self.assertEqual(val_elems[0].find("unit"), None)
         self.assertEqual(val_elems[0].find("type"), None)
         self.assertEqual(val_elems[0].find("uncertainty"), None)
-        self.assertEqual(val_elems[0].text, "[0, 45]")
+        self.assertEqual(val_elems[0].text, "[0,45]")
         self.assertEqual(prop.find("unit").text, "deg")
         self.assertEqual(len(prop.findall("unit")), 1)
         self.assertEqual(prop.find("type").text, "int")
@@ -481,6 +481,37 @@ class TestVersionConverter(unittest.TestCase):
                       </value>
                     </property>
 
+                    <property>
+                      <value>Single, string, value, with, many, commata.<type>string</type></value>
+                      <name>testSingleString</name>
+                    </property>
+
+                    <property>
+                      <value>A<type>string</type></value>
+                      <value>B<type>string</type></value>
+                      <value>C<type>string</type></value>
+                      <name>testStringList</name>
+                    </property>
+
+                    <property>
+                      <value> Single string value with wrapping whitespace <type>string</type></value>
+                      <name>testStringWhiteSpace</name>
+                    </property>
+
+                    <property>
+                      <value> Multiple Strings <type>string</type></value>
+                      <value> with wrapping <type>string</type></value>
+                      <value> Whitespace <type>string</type></value>
+                      <name>testStringListWhiteSpace</name>
+                    </property>
+
+                    <property>
+                      <value> 1 <type>int</type></value>
+                      <value> 2 <type>int</type></value>
+                      <value> 3 <type>int</type></value>
+                      <name>testIntListWhiteSpace</name>
+                    </property>
+
                   </section>
                 </odML>
         """
@@ -490,7 +521,7 @@ class TestVersionConverter(unittest.TestCase):
         conv_doc = vc._convert(vc._parse_xml())
         root = conv_doc.getroot()
         sec = root.find("section")
-        self.assertEqual(len(sec), 9)
+        self.assertEqual(len(sec), 14)
 
         # Test single value export
         prop = sec.findall("property")[0]
@@ -500,7 +531,7 @@ class TestVersionConverter(unittest.TestCase):
         # Test multiple value export
         prop = sec.findall("property")[1]
         self.assertEqual(len(prop), 2)
-        self.assertEqual(prop.find("value").text, "[1, 2, 3]")
+        self.assertEqual(prop.find("value").text, "[1,2,3]")
 
         # Test empty value export
         prop = sec.findall("property")[2]
@@ -521,7 +552,7 @@ class TestVersionConverter(unittest.TestCase):
         # Test valid multiple Value tag export
         prop = sec.findall("property")[4]
         self.assertEqual(len(prop), 7)
-        self.assertEqual(prop.find("value").text, "[0.1, 0.2, 3]")
+        self.assertEqual(prop.find("value").text, "[0.1,0.2,3]")
         self.assertEqual(prop.find("type").text, "float")
         self.assertEqual(prop.find("uncertainty").text, "0.05")
         self.assertEqual(prop.find("unit").text, "mV")
@@ -541,6 +572,35 @@ class TestVersionConverter(unittest.TestCase):
         self.assertEqual(prop.find("name").text, "Unsupported binary value dtype replace")
         self.assertEqual(prop.find("type").text, "text")
 
+        # Test single string value with commata
+        prop = sec.findall("property")[8]
+        self.assertEqual(prop.find("name").text, "testSingleString")
+        self.assertEqual(prop.find("value").text,
+                         "Single, string, value, with, many, commata.")
+
+        # Test string list import
+        prop = sec.findall("property")[9]
+        self.assertEqual(prop.find("name").text, "testStringList")
+        self.assertEqual(prop.find("value").text, "[A,B,C]")
+
+        # Test single string values wrapping whitespace removal
+        prop = sec.findall("property")[10]
+        self.assertEqual(prop.find("name").text, "testStringWhiteSpace")
+        self.assertEqual(prop.find("value").text,
+                         "Single string value with wrapping whitespace")
+
+        # Test multiple string values with wrapping whitespace removal
+        prop = sec.findall("property")[11]
+        self.assertEqual(prop.find("name").text, "testStringListWhiteSpace")
+        self.assertEqual(prop.find("value").text,
+                         "[Multiple Strings,with wrapping,Whitespace]")
+
+        # Test multiple int values with wrapping whitespaces
+        prop = sec.findall("property")[12]
+        self.assertEqual(prop.find("name").text, "testIntListWhiteSpace")
+        self.assertEqual(prop.find("type").text, "int")
+        self.assertEqual(prop.find("value").text, "[1,2,3]")
+
     def test_parse_dict_document(self):
         # Test appending tags; not appending empty sections
         doc_dict = {'Document': {'author': 'HPL', 'sections': []}}

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y libxml2-dev libxslt1-dev lib32z1-dev
3.5
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
importlib-metadata==4.8.3
iniconfig==1.1.1
isodate==0.6.1
lxml==5.3.1
-e git+https://github.com/G-Node/python-odml.git@a75d1db5ddb02cf7414b17ed41ef97a80c6245fb#egg=odML
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
PyYAML==3.12
rdflib==5.0.0
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
zipp==3.6.0

name: python-odml
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - isodate==0.6.1
      - lxml==5.3.1
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pyyaml==3.12
      - rdflib==5.0.0
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/python-odml

test/test_version_converter.py::TestVersionConverter::test_convert_odml_file test/test_version_converter.py::TestVersionConverter::test_convert_odml_file_value
test/test_version_converter.py::TestVersionConverter::test_convert_json_file test/test_version_converter.py::TestVersionConverter::test_convert_odml_file_document test/test_version_converter.py::TestVersionConverter::test_convert_odml_file_property test/test_version_converter.py::TestVersionConverter::test_convert_odml_file_section test/test_version_converter.py::TestVersionConverter::test_convert_xml_file test/test_version_converter.py::TestVersionConverter::test_convert_yaml_file test/test_version_converter.py::TestVersionConverter::test_handle_include test/test_version_converter.py::TestVersionConverter::test_handle_repository test/test_version_converter.py::TestVersionConverter::test_parse_dict_document test/test_version_converter.py::TestVersionConverter::test_parse_dict_properties test/test_version_converter.py::TestVersionConverter::test_parse_dict_sections test/test_version_converter.py::TestVersionConverter::test_parse_dict_values test/test_version_converter.py::TestVersionConverter::test_replace_same_name_entites test/test_version_converter.py::TestVersionConverter::test_write_to_file
.travis.yml odml/tools/xmlparser.py odml/tools/version_converter.py
.travis.yml odml/tools/xmlparser.py odml/tools/version_converter.py