diff --git a/ietf/utils/tests.py b/ietf/utils/tests.py
index 2dd861cd11..872aa366b9 100644
--- a/ietf/utils/tests.py
+++ b/ietf/utils/tests.py
@@ -1,4 +1,4 @@
-# Copyright The IETF Trust 2014-2020, All Rights Reserved
+# Copyright The IETF Trust 2014-2025, All Rights Reserved
# -*- coding: utf-8 -*-
@@ -741,6 +741,23 @@ def test_render_author_name(self):
"J. Q.",
)
+ @patch("ietf.utils.xmldraft.XMLDraft.__init__", return_value=None)
+ def test_get_title(self, mock_init):
+ xmldraft = XMLDraft("fake")
+ self.assertTrue(mock_init.called)
+ # Stub XML that does not have a front/title element
+ xmldraft.xmlroot = lxml.etree.XML(
+ "" # no title
+ )
+ self.assertEqual(xmldraft.get_title(), "")
+
+ # Stub XML that has a front/title element
+ xmldraft.xmlroot = lxml.etree.XML(
+ "This Is the Title"
+ )
+ self.assertEqual(xmldraft.get_title(), "This Is the Title")
+
+
def test_capture_xml2rfc_output(self):
"""capture_xml2rfc_output reroutes and captures xml2rfc logs"""
orig_write_out = xml2rfc_log.write_out
diff --git a/ietf/utils/xmldraft.py b/ietf/utils/xmldraft.py
index 3ac9a269c7..7ef6605c78 100644
--- a/ietf/utils/xmldraft.py
+++ b/ietf/utils/xmldraft.py
@@ -1,4 +1,4 @@
-# Copyright The IETF Trust 2022, All Rights Reserved
+# Copyright The IETF Trust 2022-2025, All Rights Reserved
# -*- coding: utf-8 -*-
import datetime
import io
@@ -147,7 +147,8 @@ def parse_docname(xmlroot):
return revmatch.group('filename'), revmatch.group('rev')
def get_title(self):
- return self.xmlroot.findtext('front/title').strip()
+ title_text = self.xmlroot.findtext('front/title')
+ return "" if title_text is None else title_text.strip()
@staticmethod
def parse_creation_date(date_elt):