/** * Extracts the available formats from the provided DOM element. If it does not contain any * nationalPrefixFormattingRule, the one passed-in is retained. The nationalPrefix, * nationalPrefixFormattingRule and nationalPrefixOptionalWhenFormatting values are provided from * the parent (territory) element. */ // @VisibleForTesting internal static void loadAvailableFormats(PhoneMetadata.Builder metadata, XmlElement element, String nationalPrefix, String nationalPrefixFormattingRule, bool nationalPrefixOptionalWhenFormatting) { String carrierCodeFormattingRule = ""; if (element.HasAttribute(CARRIER_CODE_FORMATTING_RULE)) { carrierCodeFormattingRule = validateRE( getDomesticCarrierCodeFormattingRuleFromXmlElement(element, nationalPrefix)); } var numberFormatXmlElements = element.GetElementsByTagName(NUMBER_FORMAT); bool hasExplicitIntlFormatDefined = false; int numOfFormatXmlElements = numberFormatXmlElements.Count; if (numOfFormatXmlElements > 0) { for (int i = 0; i < numOfFormatXmlElements; i++) { XmlElement numberFormatXmlElement = (XmlElement)numberFormatXmlElements.Item(i); NumberFormat.Builder format = NumberFormat.newBuilder(); if (numberFormatXmlElement.HasAttribute(NATIONAL_PREFIX_FORMATTING_RULE)) { format.setNationalPrefixFormattingRule( getNationalPrefixFormattingRuleFromXmlElement(numberFormatXmlElement, nationalPrefix)); } else { format.setNationalPrefixFormattingRule(nationalPrefixFormattingRule); } if (format.HasNationalPrefixFormattingRule()) { if (numberFormatXmlElement.HasAttribute(NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING)) { format.setNationalPrefixOptionalWhenFormatting( Boolean.Parse(numberFormatXmlElement.GetAttribute( NATIONAL_PREFIX_OPTIONAL_WHEN_FORMATTING))); } else { format.setNationalPrefixOptionalWhenFormatting(nationalPrefixOptionalWhenFormatting); } } if (numberFormatXmlElement.HasAttribute(CARRIER_CODE_FORMATTING_RULE)) { format.setDomesticCarrierCodeFormattingRule(validateRE( getDomesticCarrierCodeFormattingRuleFromXmlElement(numberFormatXmlElement, nationalPrefix))); } else { format.setDomesticCarrierCodeFormattingRule(carrierCodeFormattingRule); } loadNationalFormat(metadata, numberFormatXmlElement, format); metadata.addNumberFormat(format); if (loadInternationalFormat(metadata, numberFormatXmlElement, format.build())) { hasExplicitIntlFormatDefined = true; } } // Only a small number of regions need to specify the intlFormats in the xml. For the majority // of countries the intlNumberFormat metadata is an exact copy of the national NumberFormat // metadata. To minimize the size of the metadata file, we only keep intlNumberFormats that // actually differ in some way to the national formats. if (!hasExplicitIntlFormatDefined) { metadata.clearIntlNumberFormat(); } } }