camera_metadata: Automatically linkify tag names

Change-Id: I5f07a99765174f519e5d1187b38fd0e7ab355d3f
diff --git a/camera/docs/metadata_parser_xml.py b/camera/docs/metadata_parser_xml.py
index dd53131..ff5b1cc 100755
--- a/camera/docs/metadata_parser_xml.py
+++ b/camera/docs/metadata_parser_xml.py
@@ -53,7 +53,7 @@
 
 class MetadataParserXml:
   """
-  A class to parse any XML file that passes validation with metadata-validate.
+  A class to parse any XML block that passes validation with metadata-validate.
   It builds a metadata_model.Metadata graph and then renders it over a
   Mako template.
 
@@ -61,26 +61,43 @@
     soup: an instance of BeautifulSoup corresponding to the XML contents
     metadata: a constructed instance of metadata_model.Metadata
   """
-  def __init__(self, file_name):
+  def __init__(self, xml, file_name):
     """
     Construct a new MetadataParserXml, immediately try to parse it into a
     metadata model.
 
     Args:
-      file_name: path to an XML file that passes metadata-validate
+      xml: The XML block to use for the metadata
+      file_name: Source of the XML block, only for debugging/errors
 
     Raises:
-      ValueError: if the XML file failed to pass metadata_validate.py
+      ValueError: if the XML block failed to pass metadata_validate.py
     """
-    self._soup = validate_xml(file_name)
+    self._soup = validate_xml(xml)
 
     if self._soup is None:
-      raise ValueError("%s has an invalid XML file" %(file_name))
+      raise ValueError("%s has an invalid XML file" % (file_name))
 
     self._metadata = Metadata()
     self._parse()
     self._metadata.construct_graph()
 
+  @staticmethod
+  def create_from_file(file_name):
+    """
+    Construct a new MetadataParserXml by loading and parsing an XML file.
+
+    Args:
+      file_name: Name of the XML file to load and parse.
+
+    Raises:
+      ValueError: if the XML file failed to pass metadata_validate.py
+
+    Returns:
+      MetadataParserXml instance representing the XML file.
+    """
+    return MetadataParserXml(file(file_name).read(), file_name)
+
   @property
   def soup(self):
     return self._soup
@@ -288,7 +305,7 @@
   file_name = sys.argv[1]
   template_name = sys.argv[2]
   output_name = sys.argv[3] if len(sys.argv) > 3 else None
-  parser = MetadataParserXml(file_name)
+  parser = MetadataParserXml.create_from_file(file_name)
   parser.render(template_name, output_name)
 
   sys.exit(0)