How to import xml file to dart object

664

Here is an example of how you can parse this XML using the xml package from: https://pub.dev/packages/xml

import 'package:xml/xml.dart';

const xml = '''
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfViewReads xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ViewReads>
    <CounterAccount>7e7386db-ae4e-47f8-a473-8a5534b8b421</CounterAccount>
    <ParentCounter>00000000-0000-0000-0000-000000000000</ParentCounter>
    <CounterGuid>88165f87-113b-4503-bd95-01cfc778cf0e</CounterGuid>
    <CounterID>354</CounterID>
    <AccountName>يحي العامر</AccountName>
    <AreaName>مربع الشارع العام  وغزه</AreaName>
    <AddressDesc>منطقه الوء الاخضر</AddressDesc>
    <Phone>771707009</Phone>
    <FazName>سنجل فاز</FazName>
    <Balance>865.0000</Balance>
    <LastRead>7332.00</LastRead>
  </ViewReads>
  <ViewReads>
    <CounterAccount>46e2bacc-644f-47fb-abe7-6589f880667e</CounterAccount>
    <ParentCounter>00000000-0000-0000-0000-000000000000</ParentCounter>
    <CounterGuid>2d2f1a40-9dcf-4a3c-9fd2-081d3be83aaa</CounterGuid>
    <CounterID>2052</CounterID>
    <AccountName>كمال محمد علي ثامر</AccountName>
    <AreaName>مربع الشارع العام  وغزه</AreaName>
    <AddressDesc>خلف كوافير السلطانه</AddressDesc>
    <Phone>771363922</Phone>
    <FazName>سنجل فاز</FazName>
    <Balance>1560.0000</Balance>
    <LastRead>84.00</LastRead>
    <UserGuid>00000000-0000-0000-0000-000000000000</UserGuid>
  </ViewReads>
</ArrayOfViewReads>
''';

class ViewReads {
  final String counterAccount;
  final String parentCounter;
  final String counterGuid;
  final int counterID;
  final String accountName;
  final String areaName;
  final String addressDesc;
  final String phone;
  final String fazName;
  final double balance;
  final double lastRead;
  final String userGuid;

  ViewReads(
      this.counterAccount,
      this.parentCounter,
      this.counterGuid,
      this.counterID,
      this.accountName,
      this.areaName,
      this.addressDesc,
      this.phone,
      this.fazName,
      this.balance,
      this.lastRead,
      this.userGuid);

  factory ViewReads.fromXmlElement(XmlElement xmlElement) => ViewReads(
      xmlElement.findElements('CounterAccount').single.text,
      xmlElement.findElements('ParentCounter').single.text,
      xmlElement.findElements('CounterGuid').single.text,
      int.parse(xmlElement.findElements('CounterID').single.text),
      xmlElement.findElements('AccountName').single.text,
      xmlElement.findElements('AreaName').single.text,
      xmlElement.findElements('AddressDesc').single.text,
      xmlElement.findElements('Phone').single.text,
      xmlElement.findElements('FazName').single.text,
      double.parse(xmlElement.findElements('Balance').single.text),
      double.parse(xmlElement.findElements('LastRead').single.text),
      _firstTextOrNull(xmlElement.findElements('UserGuid')));

  static String _firstTextOrNull(Iterable<XmlElement> xmlElements) =>
      xmlElements.isEmpty ? null : xmlElements.single.text;

  @override
  String toString() {
    return 'ViewReads{counterAccount: $counterAccount, '
        'parentCounter: $parentCounter, '
        'counterGuid: $counterGuid, '
        'counterID: $counterID, '
        'accountName: $accountName, '
        'areaName: $areaName, '
        'addressDesc: $addressDesc, '
        'phone: $phone, '
        'fazName: $fazName, '
        'balance: $balance, '
        'lastRead: $lastRead, '
        'userGuid: $userGuid}';
  }
}

void main() {
  final document = XmlDocument.parse(xml);

  final listOfViewReads = document
      .findAllElements('ViewReads')
      .map((xmlElement) => ViewReads.fromXmlElement(xmlElement))
      .toList();

  listOfViewReads.forEach(print);
  // ViewReads{counterAccount: 7e7386db-ae4e-47f8-a473-8a5534b8b421, parentCounter: 00000000-0000-0000-0000-000000000000, counterGuid: 88165f87-113b-4503-bd95-01cfc778cf0e, counterID: 354, accountName: يحي العامر, areaName: مربع الشارع العام  وغزه, addressDesc: منطقه الوء الاخضر, phone: 771707009, fazName: سنجل فاز, balance: 865.0, lastRead: 7332.0, userGuid: null}
  // ViewReads{counterAccount: 46e2bacc-644f-47fb-abe7-6589f880667e, parentCounter: 00000000-0000-0000-0000-000000000000, counterGuid: 2d2f1a40-9dcf-4a3c-9fd2-081d3be83aaa, counterID: 2052, accountName: كمال محمد علي ثامر, areaName: مربع الشارع العام  وغزه, addressDesc: خلف كوافير السلطانه, phone: 771363922, fazName: سنجل فاز, balance: 1560.0, lastRead: 84.0, userGuid: 00000000-0000-0000-0000-000000000000}
}
Share:
664
SALMAN ABOHOLIQAH
Author by

SALMAN ABOHOLIQAH

Updated on December 27, 2022

Comments

  • SALMAN ABOHOLIQAH
    SALMAN ABOHOLIQAH over 1 year

    I'm trying to import an xml file exported by c# XmlSerializer to dart object using xml package but all my tries of importing failed.

    <?xml version="1.0" encoding="utf-8"?>
    <ArrayOfViewReads xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ViewReads>
        <CounterAccount>7e7386db-ae4e-47f8-a473-8a5534b8b421</CounterAccount>
        <ParentCounter>00000000-0000-0000-0000-000000000000</ParentCounter>
        <CounterGuid>88165f87-113b-4503-bd95-01cfc778cf0e</CounterGuid>
        <CounterID>354</CounterID>
        <AccountName>يحي العامر</AccountName>
        <AreaName>مربع الشارع العام  وغزه</AreaName>
        <AddressDesc>منطقه الوء الاخضر</AddressDesc>
        <Phone>771707009</Phone>
        <FazName>سنجل فاز</FazName>
        <Balance>865.0000</Balance>
        <LastRead>7332.00</LastRead>
      </ViewReads>
      <ViewReads>
        <CounterAccount>46e2bacc-644f-47fb-abe7-6589f880667e</CounterAccount>
        <ParentCounter>00000000-0000-0000-0000-000000000000</ParentCounter>
        <CounterGuid>2d2f1a40-9dcf-4a3c-9fd2-081d3be83aaa</CounterGuid>
        <CounterID>2052</CounterID>
        <AccountName>كمال محمد علي ثامر</AccountName>
        <AreaName>مربع الشارع العام  وغزه</AreaName>
        <AddressDesc>خلف كوافير السلطانه</AddressDesc>
        <Phone>771363922</Phone>
        <FazName>سنجل فاز</FazName>
        <Balance>1560.0000</Balance>
        <LastRead>84.00</LastRead>
        <UserGuid>00000000-0000-0000-0000-000000000000</UserGuid>
      </ViewReads>
    </ArrayOfViewReads>
    

    And here is my importing code from dart using fromJson() method that generated by VSCode:

      final file = File('C:\\Users\\SALMAN\\Desktop\\2021_1_19_559.xml');
      final document = XmlDocument.parse(file.readAsStringSync());
    
      document.children.forEach((e) {
        var v = ViewRead.fromJson(e.toString());
      });
    

    And this is the error after I tried running the code:

    Unhandled exception:
    FormatException: Unexpected character (at character 1)
    <?xml version="1.0" encoding="utf-8"?>
    ^
    
    #0      _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
    #1      _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1271:9)
    #2      _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:936:22)
    #3      _parseJson (dart:convert-patch/convert_patch.dart:40:10)
    #4      JsonDecoder.convert (dart:convert/json.dart:505:36)
    #5      JsonCodec.decode (dart:convert/json.dart:156:41)
    #6      new ViewRead.fromJson (file:///C:/Users/SALMAN/.IntelliJIdea2019.1/dart/bin/dart.dart:170:70)
    #7      main.<anonymous closure> (file:///C:/Users/SALMAN/.IntelliJIdea2019.1/dart/bin/dart.dart:16:22)
    #8      List.forEach (dart:core-patch/growable_array.dart:313:8)
    #9      _DelegatingIterableBase.forEach (package:collection/src/wrappers.dart:52:45)
    #10     main (file:///C:/Users/SALMAN/.IntelliJIdea2019.1/dart/bin/dart.dart:15:21)
    #11     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:299:32)
    #12     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
    
    
    • julemand101
      julemand101 about 3 years
      You are trying to use a JSON parser to parse XML. These two formats has nothing to do with each other which is why you are getting an error. Try take a look at the xml package here: pub.dev/packages/xml
    • SALMAN ABOHOLIQAH
      SALMAN ABOHOLIQAH about 3 years
      @julemand101 ok thank you I will try it