Data Migration - System Configuration Import
- 1 Summary
- 2 Import Examples
- 3 Generic Method with List Provider
- 3.1 Package Imports
- 3.2 Package Quantity Import
- 3.3 Package Upgrade Import
- 3.4 PackageService Imports
- 3.5 Profile Question Imports
- 3.6 GeneralLedger Imports
- 3.7 RestrictedUserName Imports
- 3.8 Inventory Importing
- 3.9 Resource Importing
- 3.10 TaxCode Importing
- 3.11 Generic Taxcode Import
- 3.12 TaxRate Imports
- 3.13 TaxCodeRate Imports
- 3.14 TaxType Importing
- 3.15 TaxClass Importing
- 3.16 TransactionCode Importing
- 3.17 TicketCategory Importing
- 3.18 TicketGroups Importing
- 3.19 ContactType Imports
- 3.20 User Extended Attributes
- 3.21 Languages Import
- 3.22 Role Imports
- 3.23 UserStatusTypes Import
- 3.24 Telecom Imports
- 3.25 Note Types Imports
- 3.26 Financial Periods Import
- 3.27 Server Imports - Server and Profile Answers
- 4 Tier Sync Imports
- 5 Rate Importer Tool
- 6 Troubleshooting - Common File Errors
Summary
This article covers the recommended and proper order for importing customer data into EngageIP. When importing large amounts of data it is recommended to use the DataMigration Utility.
Before you can proceed with any import process here please complete the article: Data Migration – Import Methods and Configuration.
Import Examples
Note: SortOrder is supported on some of the imports listed below and they will have the element included in the example where supported. The list is also here:
Culture
Language
Country
TicketCategory
TicketContactMethod
TicketPriority
TicketGroup
TicketStatus
State
County
City
The element to add into the xml would be this: SortOrder="1" or any number. 0 being default, and 1,2,3, and so on being the orders where the lowest number floats to the top of the dropdown list in EngageIP
Owners Import
Allows you to setup your owner structure.
<?xml version="1.0"?>
<Owners>
<Owner Name="Owner Import Test" Parent="Test Telecom" Role="Admin" Culture="English" Currency="USA" Language="English" OwnerParentAccountBillingType="Bill Owner Using Owner Taxes" BillGroup="Main Bill Group" CreditRating="Default" Branded="True" Country="True" State="False" County="False" City="False" UserStatusType="Enabled" />
</Owners>[cce lang="xml"]
Note: With regards to OwnerParentAccountBillingType="" result can be any of the following choices: Bill Accounts, Bill Owner Using Account Taxes, Bill Owner Using Owner Taxes, Bill Top Owner Using Account Taxes and finally Bill Top Owner Using Owner Taxes.
For example, OwnerParentAccountBillingType="Bill Owner Using Owner Taxes"
Branded indicates if the owner is Branded (presents owner account with a Setup Menu allowing for their own configuration options which will apply to all accounts under them) or Non-branded (inherits the configuration of the branded owner above them).
Country/State/County/City allows you to set the INPUT level of the address. For example, if they are all true, then pick lists will appear within the system. If they are false free form text fields will appear.
Note: Parent is the Owner below which you want to import this owner. 'Admin' is the owner by default that is installed with EngageIP.
Owner Page Extension Import
<?xml version="1.0"?>
<PageExtensions>
<PageExtension Name="TestPageExtension" Owner="/Owner=Logisense Corporation" Page="child/add" Script="return true" />
</PageExtensions>
Invoice Templates Import
Invoice templates available to the owner.
<InvoiceTemplate Name="English" Owner="Quality_Assurance" InvoiceTemplate="English" />
Your invoice template will go in the InvoiceTemplate element, however before you import, you need to use ascii characters in place of 5 key characters to allow the import. Example:
Character Name | Entity Reference | Character Reference | Numeric Reference |
---|---|---|---|
Ampersand | & | & | &#38; |
Left angle bracket | < | < | &#60; |
Right angle bracket | > | > | > |
Straight quotation mark | " | " | ' |
Apostrophe | ' | ' | " |
Name | Invoice Title or Name to appear in AdminPortal | English or ‘Residential Customer Invoice – 2 Page’ |
Owner | Name of the Owner that the role applies to | This will be based on previous import |
InvoiceTemplate | This is the html / xml code that will be entered | Any valid HTML template code Is allow here and editable from interface |
Bill Groups Import
BillGroups available to the owner.
BillGroup | Name of billgroup | ‘Credit Card Bill Group’ or ‘Residential Bill Group’ |
InvoiceTemplate | Name of invoice template you want customers with this billgroup to use | this will be based on previous import, and in the system |
Owner | Owner name | this will be based on already imported owner names |
AdvanceBillDays | Numerical value representing the number of days to prebill accounts | 0,1,2,30,45, etc |
Country Imports
Owner’s Countries
Country | Country name | ‘United States’ or ‘Canada’ |
Owner | Name of the Owner the country belongs to |
|
CountryAddressFormat | The formatting as created on the setup page | 'Address Level 1' or 'Canadian Address Format' |
Full Country Listings
Country Code Format
Long Name Format
State Imports
Owner’s States.
XML for abbreviations listed below for US states. Long Name is the full state name where as the 'State' value is often the abbreviated value.
State Listings
State Code Format
Long Name Format
Full Province Listing
County Imports
Owner’s Counties. Note the links to State and County below.
County | Name of county, or municipality | ‘Brock’, ‘York Township’ |
State | Name of State or province | ‘Idaho’ or ‘Prince Edward Island’ |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
City Imports
Owner’s Cities. Note the links between State, County and City. A city is associated with a county. If a city has more than 1 county it must be entered twice.
Country | Country name | ‘United States’ or ‘Canada’ |
State | Name of State or province | ‘Idaho’ or ‘Prince Edward Island’ |
County | Name of county, or municipality | ‘Brock’, ‘York Township’ |
City | Name of City | ‘Toronto’ or ‘New York’ |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
DisableReason Imports
Owner’s Disable Reasons
Disable Reason | Text name of disabled reason | ‘Cancelled’ or ‘Suspended’ |
DisableType | Single Alpha character denoting the type of disable | C = Cancelled S = Suspended |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
Service Imports
Defines Service offerings.
NOTE: Setup fee if zero doesn't do anything when importing, its held over from the migration from EngageIP 6 to EngageIP 8
NOTE: This is the CORE service.
Name | Name of account under which payment should b e applied. May be a child of bsmith as shown in above example | ‘bsmith’ or a child of bsmith ‘frank’ |
Code | Transaction code as already entered on setup page. Adds as a component on services | ‘DSL’ or ‘Access Service’ |
BaseFee | Value of base fee | ’30.00’ |
SetupFee | Value of setup fee | ’30.00’ |
ServiceLength | Numeric value of service length | ‘1’, or ‘12’ or any other number |
ServiceType | Type of service | ‘AccessService’, ‘Dialup’, these will be preconfigured in Adminportal |
Owner | Name of the Owner that the role applies to | this will be based on previous import |
Type | This is the period type which modifies the service length. A monthly service would hav ea servicelength of 1, and the Type would be ‘MONTH’ | Values: Once Minute Hour Day Week Month Year |
Description | Description of the service | ‘Monthly Postpaid Dialup Service’ |
ServiceTypes Import
Service Components
Each service can have one or more component. Refer to the XML samples for more details.
Provisioning Component
To import the provisioning component, a table in the EngageIP database will need to be manually updated (BOSS). Open the table ServerTypeAttributeProvisionSet, add a new row by entering a ServerTypeID, for example '1', then add a name,for example 'test', hit enter to save the row. Then you can import them with the below XML replacing the ServerTypeProvisionSet element with the name that you specified in the table.
ServiceAttributes
ServiceAttributeCost
ServiceAttributeGeneralLedger
ServiceAttributeInvoiceDetail
ServiceAttributePrepaid
ServiceAttributeProfileQuestion
ServiceAttributeProfileAnswer
Import Generic method
(NOTE: Update the reference as the two lines are associated. Two lines per profile question)
Generic Method with List Provider
Here is the generic xml to Import ServiceAttributeProfileQuestion with ProfileQuestionListprovider, in this example we are assuming a ProfileQuestionListProvider exists with the name “TestListProvider”
ServiceAttributeRadius
ServiceAttributeTaxCode
ServiceAttributeTaxExempt
TaxExemptTypes
XML Import file:
ServiceAttributeTaxType - NOTE: This is the Service Tax Category on the Setup page
ServiceAttributeTelecom
ServiceAttributeTelecomBucket
ServiceAttributeTransactionCode
Service Invoice Group
Package Imports
Defines Package Offerings. A package is made up of services and therefore you always sell packages. The services within the package will convert up to the Package type and Length. Each package can have components. Refer to the XML samples for details.
PackageAttributeContract
PackageAttributeCreditCardAuthOnly
PackageAttributeDiscount
PackageAttributeProfileAnswer
PackageProfileQuestion
PackageAttributeEquipment
PackageAttributeResource
PackageAttributeContract
Package Attribute Bulk Package
Main Package Import XML:
Generic:
NOTE: The 'code' element above in RED is not required, this is a value used in the migration from EngageIP 6 to EngageIP 8. Packages can be imported without this field.
Name | Name of package | DSL Lite Monthly 512 |
SKU | Short form name for Package | ‘DSLLT512’ |
Code | Transaction code | ‘DSL’ or ‘Access Service’ |
PackageLength | Numeric value of service length | ‘1’, or ‘12’ or any other number |
Type | This is the period type which modifies the service length. A monthly service would have a service length of 1, and the Type would be ‘MONTH’ | Values: Once Minute Hour Day Week Month Year |
Description | Description of the package | ‘Monthly Postpaid Package’ |
|
|
|
Owner | Name of the Owner that the role applies to | this will be based on previous import |
Package Quantity Import
Allows the import of package quantity for services if no other quantity component exists on the package for specified service.
Package Upgrade Import
Allows importing of the upgrade component onto packages. Multiple upgrade components are allowed here. Monthly Package in the example is the package on which the upgrade component will be placed and the package that you would like to allow an upgrade to would be the 'Quarterly Package' in the below. Quarterly service is the one to which we will tag any GL codes if they exist when a debit is added do to an upgrade charge.
PackageService Imports
This is the connection between the packages and services known as the Package Service Connector. Basically, the collection of services that make up the packages.
Package | Name of the package that will show to the customer and in reports |
|
Service | Name of the service |
|
Owner | Name of the Owner that the role applies to |
|
Profile Question Imports
Account Profiles Questions.
Driven from the Data Types table using the REGEX values defined here.
Text
Integer
Double
Date/Time
Date
Password
Address
Postal Code
Email
Phone
CreditCard Number
CVV
CreditCard Expiry Date
Full Name
Bank Routing Number
Bank Account Number
Currency
IP Address
Memo
Encrypt
Domain Name
MAC Address
Port
Script
Time
Terms
Day Of The Month
Path
URL
Usage Phone Number
File
Name | Name of the profile | ‘Profile question 1- name of cat’ |
Question | Value that is represented in interface when adding package, usually the question you need answered | value of the answer here |
DataType | Driven from the Data Types table using the REGEX values defined here. | These names represent the format of the intended data. Name like ‘John Smith’. Email like ‘userame@domain.com’IP Address like ‘192.168.1.1’ ========== Name Text Integer Double Date/Time Date Password Address Postal Code Email Phone CreditCard Number CVV CreditCard Expiry Date Full Name Bank Routing Number Bank Account Number Currency IP Address Memo Encrypt Domain Name MAC Address Port Script Time Terms Day Of The Month Path URL Usage Phone Number File Duration |
Length | Value of charactors if the number of charactors need to be restricted | 15 |
Required | Defines whether profile question is required when adding service or whether it can be left blank | ‘True’ or ‘False’ |
Default | The default answer to be prepopulated | ‘192.168.1.1’, or ‘my favourite colour is blue’ |
GeneralLedger Imports
Defines General Ledger Codes
Name | Name of GL Code | ‘Credit GLCode’ |
GLDebit | Debit code | ‘AR’ |
GLCredit | Credit Code | ‘Sales’ |
Owner | Name of the Owner that the role applies to | this will be based on previous import |
RestrictedUserName Imports
Restricted user names for an owner.
User | Name or letter combination that is restricted | English or ‘Residential Customer Invoice – 2 Page’ |
Owner | Name of the Owner that the role applies to | this will be based on previous import |
Inventory Importing
InventoryItemDefinitionCategory
Defines the Inventory Item’s Category.
InventoryItemDefinition
Defines the Inventory Item’s description and details.
InventoryImports InventoryItem
Defines the Inventory Item
InventoryLocation
Defines Inventory Item Locations
Resource Importing
ResourceItem
Defines the Resource Management Item.
ResourceType
Defines the Resource Item Type.
ResourceTypeCategory
Defines the Resource Item’s Category Type.
ResourceTypeCategoryOwner
Defines the Resource Item’s Owner.
ResourceItemPool
Defines the Resource Item’s Pool.
ResourceTypeProvider
Defines the Resource Item’s Provider.
Resource Profile Question and Answer
To import just the profile question, use the first two data rows. note that the ReferenceName needs to be unique per line for importing
CardType
Owner’s Credit Card Types
CardType | Name of the card | Visa, Mastercard, American Express |
Owner | Name of the Owner | this will be based on previous import |
TaxCode Importing
Owner’s Tax Codes which are made up of Tax Rates.
TaxType = Service Tax Category
TaxClass = Account Tax Category (read further down for XML here)
TaxCode | Taxcode name, or identify of taxcode, descriptive | ‘Ontario Tax’ or ‘USA’ |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
Country | Country name | ‘United States’ or ‘Canada’ |
County | Name of county, or municipality | ‘Brock’, ‘York Township’ |
City | Name of City | ‘Toronto’ or ‘New York’ |
Generic Taxcode Import
TaxRate Imports
Owner’s Tax Rates
Owner | Name of the Owner the country belongs to | this will be based on previous import |
Rate | Value of the rate | 0.05 = 5%, 0.1 = 10%, 1.00 = 100% |
Description | Description of the tax rate for internal purposes | Ex: 6% tax for Atlanta, USA |
DisplayName | Name to show invoice or to customers in a customer portal | ‘Atlanta Sales Tax’, or ‘ Goods and Services Tax’ |
TaxCodeRate Imports
Owner’s Tax Code Rates. This represents the link between tax codes and tax rates.
Owner | Name of the Owner the country belongs to | this will be based on previous import |
TaxCode | Taxcode name, or identify of taxcode, descriptive | ‘Ontario Tax’ or ‘USA’ |
TaxRate | Description of the tax rate for internal purposes | Ex: 6% tax for Atlanta, USA |
TaxType Importing
(AKA Service Tax Category)This is the tax grouping for services used in conjunction with the tax codes.
TaxType | Descriptive name of taxtype | ‘Access Tax’, ‘Residential Tax’ |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
TaxClass Importing
This is Account Tax Category in the AdminPortal UI.
TransactionCode Importing
Service’s Transaction Code for grouping.
TransactionCode | Descriptive name of transaction code | Debit, Credit, Refund, Charges, Sale |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
TicketCategory Importing
Owner’s Ticket Categories
Category | Descriptive name of ticket category | Support, Billing, Administrative |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
TicketGroups Importing
TicketTypeCategoryConnector
Owner Ticket Email Template
Ticket Extended Attribute Import
Here is for one with a select list:
TicketSubCategory
Owners Sub Categories
The migrator format here is the 'generic' format (where there is no specific import format to import the specific piece of data). It requires that you enter the owner as shown below in a string with the category. (The string of data actually then searches through the tables for the right owner to find where to import the data to)
Ticket Resolution
Ticket resolutions attached to Categories / Subcategories
TicketStatus
Type = "Open" or "Closed" (system statuses)
Name = your custom status
TicketPriority
Owner’s Ticket Priority
Priority | Ticket Priority levels | Low, Medium, High, Critical |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
ContactType Imports
Owner’s Contact Types. It is important that you define the contact types required with the appropriate contact points.
Name | Name defining contact type | Billing Contact, Admin Contact, Technical Contact |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
BillingContact | Defines whether this contacttype will be used for billing | True or False |
EmailContact | Defines whether this contacttype will be used for emailing system emails | True or False |
ServiceContact | Defines whether this contacttype will be used for service contact requests | True or False |
Required | Defines whether this contact is required to be completed when adding customer accounts | True or False |
User Extended Attributes
ContactPointType Imports
Owner’s Contact Points related to the Contact Type. These are the contact points available to Contact Types and MUST be well defined.
Name | Descriptive name of ticket category | Support, Billing, Administrative |
Owner | Name of the Owner the country belongs to | this will be based on previous import |
ContactType | Name of contact type | this will be preconfigured in the system for contact types on the setup page |
DataType | Variable data type, defined in database | These names represent the format of the intended data. Name like ‘John Smith’. Email like ‘userame@domain.com’IP Address like ‘192.168.1.1’ ========== Name Text Integer Double Date/Time Date Password Address Postal Code Email Phone CreditCard Number CVV CreditCard Expiry Date Full Name Bank Routing Number Bank Account Number Currency IP Address Memo Encrypt Domain Name MAC Address Port Script Time Terms Day Of The Month Path URL Usage Phone Number File Duration |
Required | Defining whether this contact point is required when adding the user account | Values: ‘True’ or ‘False’ |
Languages Import
Allows the importing of language translations. You must have entered the language name already on the setup page for each owner you need to import translations for.
Steps to import translation xml files into EngageIP
locate the language ID from the language table
delete * from translations where languageID = X
use DB migrator to import the xml.
For generic translation xml files be sure to find and replace the owner with the correct owner for import.
For generic import which is used if special language characters and accents will not work is the below XML format where language ID corresponds to the ID of the language in the database:
Name | Word in English that is to be translated | Word to be translated, ie 'Name' |
Value | The word which replaces the name field | 'Nom' (French for 'Name' |
Owner | Owner that this translation applies to | LogiSense Corporation |
Language | Language that the value will apply to | 'French' |
Role Imports
Specifies the roles available to each owner.
Role | Name of the permissions set you wish to apply to a customer | Will be based on previous import |
Owner | Name of the Owner that the role applies to | this will be based on previous import |
Role Permissions
Role Attribute Profile Question
Update the 'x' there in the bottom sections with the ID of the role for each owner.
Same as above but this provides a select list instead of a text input box:
UserStatusTypes Import
OwnerID must = the ID of the owner in the 'owner' table
StatusTypeID must equal the id of the status type in 'StatusType' table
ImageURL - this is the URL pointing to the image you want displayed on the account for the specified status. A cancelled stamp or suspended stamp
ShowInAccountStatistics - this defines whether you want this named status to show in the account statistics at the bottom left of each page
Telecom Imports
TelecomRatePlan
The sample below provides a way to import rate plans. Note that if Inbound = true, it means you are importing an inbound rateplan. If its outbound, set that flag as false.
TelecomBuckets
The telecom buckets available within the system. These can be assigned to services using the Telecom Bucket service attribute.
Import UDR Rate Plan
Attached UDR Rateplan to a Package/ Service
To import UDRClass, and UDRRateGroups the XML import works out of the box using the following format(s).
Notes
The opening and closing tags are plural (just add s (UDRClasss is correct))
Name = “the UDRClass Name you want to add” UDRRater = “Class” or “Geo Tree”
/Owner = The Owner Name (/ in front tells Generic import to convert to OwnerID to store in table)
For UDRRateGroups, they need UDRRates to be useful, and the stored procedure takes care of copying both, so you may want to continue having that as part of your procedure, but this will be useful for any new (System-wide) rategroups, add them to one Owner (ie: Logisense Corporation), import rates and then use the SP to copy to all.
Notes
The opening and closing tags are plural (UDRRateGroups)
/Owner = The Owner Name (/ in front tells Generic import to convert to OwnerID to store in table)
Name = “the UDRRateGroup Name you want to add” Start="2010-01-01 00:00:00.000" --Start Date, any CDR before this date will not be rated by this Rate Group (so use “2010-01-01 00:00:00.000” , unless a specific date is required) End="9999-12-31 23:59:59.997" -- End Date, any CDR after this date will not be rated by this Rate Group(so use “9999-12-31 23:59:59.997”, unless a specific date is required) Retired="0" 0=active 1=retired - Informational only (if rate group is retired End Date should be set to the specific date of retirement – no CDR will process after End Date ) UseForCost="0" -- 0=Not a Cost plan 1=Cost Plan
UDR Rate Groups to RatePlans
UDR Custom Field Imports
Note Types Imports
Financial Periods Import
FinancialPeriod
Server Imports - Server and Profile Answers
You need to replace the following in the code:
Logisense Corporation = owner name
1.1.1.1 - IP of server or URL
test = name of server
Username and Password - labels of the profile questions existing
answer1 and answer2 - the profile question answers to import
Tier Sync Imports
In order to get it working a TierSyncOwner and TierSyncPackage has to be present already in the database and make sure you reference the correct package and servers by name.
Rate Importer Tool
Introduction
The LogiSense Rate Importer is a tool that has been designed to make importing new rates and updating existing rates easy. The Importer can take text files, map the data to rates, and automatically determine if the rates are new/updated/same compared to existing rates.
Starting the Importer
Run the .exe named “Logisense.RateImporter.exe”. You will be greeted with a window that looks like this:
Click the Next button.
Now you are presented with the following options:
From here you need to tell the Importer what kind of file you will be importing, and the name of the file. Note that there is also a “View History” button which will show you a history of previous imports.
Click the Import Profile drop-down to select a file type that you will be importing:
After you have selected what you need, select the import file by clicking the Browse button and then the Next button to continue.
Next you will be presented with the following options. Please select the appropriate values for these rates from the drop-downs and click Next.
Now you will be shown the Data Verification screen (Note: there may be a slight lag before this loads). This shows the data from the file, and how it is being mapped. Note in our example, the first column is being used for Pattern, the second for the rate Amount, and the third having the name ColumnX (in this case 2), tells us the importer will not use it.
If the data here looks like the correct file that you wish to import, and the mappings look correct, click Next.
The next screen is not interactive, and merely indicates the progress of the Importer as it validates the new rates:
When the validation is completed, you will be presented with the results:
In this example, a somewhat incomplete GeoTree was used (and the first row was intentionally invalid), hence it found 6712 errors. At this point we can click Cancel, if we wish to try and fix things (update the Geotree, use the correct rates file if this one is wrong, etc.) We can also choose to click Next and continue importing the valid rates that were found. Note that before we select either option, we also have the “Save Errors” button on the left, where it will save a CSV file with all the ‘bad’ rates out.
Suppose in the scenario above we click Next and import the good rates, but later we wish that we had a list of the bad rates. If we re-run the importer and load the same rate file, we should end up at this screen with the message “Out of the 146966 rates in the import file, there were 0 new rates, 0 updated rates, and the following 6712 errors.” Now we can once again view the errors. In the event that we fixed the problems in the Geotree, then we could now import the once problematic rates.
So if there are errors, it is your choice if you want to try fixing them before importing any rates, or import the valid ones first, and import the rest later.
After clicking Next from the Validation step, you will be presented with the following step:
This will be displayed and show progress while the rates are created/updated. Note that when it says “this may take a while”, it’s telling the truth. Except a couple minutes at the very least, for a US NPANXX import, possibly longer.
Finally we are here:
Rates are now imported. You can check the rates in EngageIP to see that they look correct. You may also fix any problems that existed and re-import if you opted to ignore validation errors.
File formats supported:
Direct Pattern Match (i.e. NPANXX)
CSV With:
NPANXX in the first column, no leading 1
Amount in the second column (floating point number)
International w/WorldZone
CSV With:
Pattern in the first column (does not include country code)
WorldZone in the second column (1 = NANPA)
DestinationCode in the third column (country code if international)
Amount in the fourth column (floating point number)
International w/Full Dial Pattern
CSV With:
Country
Full pattern in the first column (country code included)
Amount in the second column (floating point number)
Lata/OCN
CSV With:
OCN in the first column (three digits, and one alpha/digit)
Lata in the second column (three digits)
Amount in the third column (floating point number)
Troubleshooting - Common File Errors
Make sure your opening and closing tags are pluralized, ie add an 's' to the end. <tests> <test name="asdf"> </tests>
Make sure elements are spelled correctly and capitalized correctly
Make sure the data referenced exists in EngageIP. i.e. for things like taxcode being applied to customers, the taxcode specified must exist exactly as you have it typed in the file
If you are trying to open an XML file in Excel, make sure to have more than one line of data, two lines is the minimum otherwise Excel won't recognize the format correctly (this does not include opening and closing tags)