MyInvois XML 阅读器:马来西亚 e-Invoice 专用

把 MyInvois 电子发票 XML 粘贴进来,像人读发票一样看:抬头、供应商、买方、税款明细、总额和每一项项目,每个值都标注它来自哪条 UBL 路径,一眼分清哪个字段是哪个。这个工具是阅读器,不是校验器,只帮你读懂文件,不作任何合规判断,文件也不会被上传。

🔒 100% 浏览器内运行 · 零服务器上传

马来西亚规则与特殊情况

电子发票 XML 是 UBL 2.1 文档:一棵带命名空间前缀的元素树,所以不管写作者给这些命名空间选了什么前缀,cbc:ID 和 cac:TaxTotal 都是同一个元素。本阅读器按元素名称后面的部分(本地名)匹配,每个值都标注 LHDN SDK 给它写的路径。下表用的是本页的示例发票:

人读到的内容阅读器从哪里读到
发票号码 INV20261107001根元素上的 cbc:ID
开具日期和时间cbc:IssueDate、cbc:IssueTime
发票类型代码 01 和代码列表版本 1.0cbc:InvoiceTypeCode 和它的 @listVersionID 属性
供应商名称、TIN、BRN、SST、MSIC 和地址cac:AccountingSupplierParty/…,每种识别号码用 schemeID 区分
买方名称和 TIN(买方没有 BRN)cac:AccountingCustomerParty/…
税款总额 37.40,然后每种税种一行小计cac:TaxTotal/cbc:TaxAmount 和每个 cac:TaxSubtotal
应付金额 491.40cac:LegalMonetaryTotal/cbc:PayableAmount
三项发票项目,其中一行是 100% 贸易折扣每一项 cac:InvoiceLine
  • 这是阅读器,不是校验器。它从不说一份文件合法、合规、已接受或已拒绝,也不计算 LHDN 会不会接受它。观察清单只报告“有没有”,比如买方 BRN:这个文件里没有,不表示这个文件应该有它。
  • 金额按文件里写的原样显示。不做浮点运算,也不重算;唯一的推导数是几行的行金额之和,而且它会标注这是阅读器自己加的。
  • 文件里没有的可选元素就是没有,不写 0.00。它显示为 —。空输入、不是 XML、根元素不是 Invoice(贷项通知单会有自己的提示)、以及超过 2 MB 的文字,各有各的提示。
  • 元素按本地名匹配。不管文件用 Cbc:ID、cbc:ID 还是其他前缀写同一个命名空间,读出来的都是一样。
  • 法规问题请以 LHDN 为准。LHDN 在 MyInvois SDK 站点发布电子发票结构和税种列表,这里的值标签来自这些列表,本工具不对任何文件作合规承诺。

你粘贴的内容不会离开浏览器:本页是静态 JavaScript,没有任何网络请求。

处理前后

处理前

<?xml version="1.0" encoding="UTF-8"?>
<ubl:Invoice xmlns:ubl="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2.1"
  xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
  xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  <cbc:ID>INV20261107001</cbc:ID>
  <cbc:IssueDate>2026-11-07</cbc:IssueDate>
  <cbc:IssueTime>14:35:00</cbc:IssueTime>
  <cbc:InvoiceTypeCode listVersionID="1.0">01</cbc:InvoiceTypeCode>
  <cbc:DocumentCurrencyCode>MYR</cbc:DocumentCurrencyCode>
  <cbc:TaxCurrencyCode>MYR</cbc:TaxCurrencyCode>
  <cac:AccountingSupplierParty>
    <cac:Party>
      <cac:PartyIdentification>
        <cbc:ID schemeID="TIN">C12345678901</cbc:ID>
      </cac:PartyIdentification>
      <cac:PartyIdentification>
        <cbc:ID schemeID="BRN">202501123456</cbc:ID>
      </cac:PartyIdentification>
      <cac:PartyIdentification>
        <cbc:ID schemeID="SST">B16-1234567890</cbc:ID>
      </cac:PartyIdentification>
      <cbc:IndustryClassificationCode schemeID="MSIC">62012</cbc:IndustryClassificationCode>
      <cac:PostalAddress>
        <cac:AddressLine>
          <cbc:Line>12, Jalan Teknologi 3/1, Taman Sains</cbc:Line>
        </cac:AddressLine>
        <cbc:CityName>Cyberjaya</cbc:CityName>
        <cbc:PostalZone>63000</cbc:PostalZone>
        <cbc:CountrySubentityCode>10</cbc:CountrySubentityCode>
        <cac:Country>
          <cbc:IdentificationCode>MYS</cbc:IdentificationCode>
        </cac:Country>
      </cac:PostalAddress>
      <cac:Contact>
        <cbc:Telephone>+603-8311 0000</cbc:Telephone>
        <cbc:ElectronicMail>billing@hoelee.com</cbc:ElectronicMail>
      </cac:Contact>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Hoelee Enterprise</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingSupplierParty>
  <cac:AccountingCustomerParty>
    <cac:Party>
      <cac:PartyIdentification>
        <cbc:ID schemeID="TIN">C87654321090</cbc:ID>
      </cac:PartyIdentification>
      <cac:PartyLegalEntity>
        <cbc:RegistrationName>Restoran Aisyah Sdn. Bhd.</cbc:RegistrationName>
      </cac:PartyLegalEntity>
    </cac:Party>
  </cac:AccountingCustomerParty>
  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="MYR">37.40</cbc:TaxAmount>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="MYR">400.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="MYR">32.00</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>02</cbc:ID>
        <cbc:Percent>8.00</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
    <cac:TaxSubtotal>
      <cbc:TaxableAmount currencyID="MYR">54.00</cbc:TaxableAmount>
      <cbc:TaxAmount currencyID="MYR">5.40</cbc:TaxAmount>
      <cac:TaxCategory>
        <cbc:ID>01</cbc:ID>
        <cbc:Percent>10.00</cbc:Percent>
        <cac:TaxScheme>
          <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
        </cac:TaxScheme>
      </cac:TaxCategory>
    </cac:TaxSubtotal>
  </cac:TaxTotal>
  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="MYR">454.00</cbc:LineExtensionAmount>
    <cbc:TaxExclusiveAmount currencyID="MYR">454.00</cbc:TaxExclusiveAmount>
    <cbc:TaxInclusiveAmount currencyID="MYR">491.40</cbc:TaxInclusiveAmount>
    <cbc:AllowanceTotalAmount currencyID="MYR">0.00</cbc:AllowanceTotalAmount>
    <cbc:ChargeTotalAmount currencyID="MYR">0.00</cbc:ChargeTotalAmount>
    <cbc:PayableRoundingAmount currencyID="MYR">0.00</cbc:PayableRoundingAmount>
    <cbc:PayableAmount currencyID="MYR">491.40</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>
  <cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="MYR">400.00</cbc:LineExtensionAmount>
    <cac:TaxTotal>
      <cbc:TaxAmount currencyID="MYR">32.00</cbc:TaxAmount>
      <cac:TaxSubtotal>
        <cbc:TaxableAmount currencyID="MYR">400.00</cbc:TaxableAmount>
        <cbc:TaxAmount currencyID="MYR">32.00</cbc:TaxAmount>
        <cac:TaxCategory>
          <cbc:ID>02</cbc:ID>
          <cbc:Percent>8.00</cbc:Percent>
          <cac:TaxScheme>
            <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
          </cac:TaxScheme>
        </cac:TaxCategory>
      </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:Item>
      <cbc:Description>Website maintenance service — November 2026</cbc:Description>
      <cac:CommodityClassification>
        <cbc:ItemClassificationCode listID="CLASS">030</cbc:ItemClassificationCode>
      </cac:CommodityClassification>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="MYR">40.00</cbc:PriceAmount>
    </cac:Price>
  </cac:InvoiceLine>
  <cac:InvoiceLine>
    <cbc:ID>2</cbc:ID>
    <cbc:InvoicedQuantity unitCode="EA">6</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="MYR">54.00</cbc:LineExtensionAmount>
    <cac:TaxTotal>
      <cbc:TaxAmount currencyID="MYR">5.40</cbc:TaxAmount>
      <cac:TaxSubtotal>
        <cbc:TaxableAmount currencyID="MYR">54.00</cbc:TaxableAmount>
        <cbc:TaxAmount currencyID="MYR">5.40</cbc:TaxAmount>
        <cac:TaxCategory>
          <cbc:ID>01</cbc:ID>
          <cbc:Percent>10.00</cbc:Percent>
          <cac:TaxScheme>
            <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
          </cac:TaxScheme>
        </cac:TaxCategory>
      </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:Item>
      <cbc:Description>IP camera 4MP — wired</cbc:Description>
      <cac:CommodityClassification>
        <cbc:ItemClassificationCode listID="CLASS">022</cbc:ItemClassificationCode>
      </cac:CommodityClassification>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="MYR">9.00</cbc:PriceAmount>
    </cac:Price>
  </cac:InvoiceLine>
  <cac:InvoiceLine>
    <cbc:ID>3</cbc:ID>
    <cbc:InvoicedQuantity unitCode="EA">1</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="MYR">0.00</cbc:LineExtensionAmount>
    <cac:TaxTotal>
      <cbc:TaxAmount currencyID="MYR">0.00</cbc:TaxAmount>
      <cac:TaxSubtotal>
        <cbc:TaxableAmount currencyID="MYR">0.00</cbc:TaxableAmount>
        <cbc:TaxAmount currencyID="MYR">0.00</cbc:TaxAmount>
        <cac:TaxCategory>
          <cbc:ID>06</cbc:ID>
          <cac:TaxScheme>
            <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
          </cac:TaxScheme>
        </cac:TaxCategory>
      </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:AllowanceCharge>
      <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
      <cbc:Amount currencyID="MYR">46.00</cbc:Amount>
      <cbc:AllowanceChargeReason>Trade discount — end of year</cbc:AllowanceChargeReason>
    </cac:AllowanceCharge>
    <cac:Item>
      <cbc:Description>E-commerce setup consultation</cbc:Description>
      <cac:CommodityClassification>
        <cbc:ItemClassificationCode listID="CLASS">022</cbc:ItemClassificationCode>
      </cac:CommodityClassification>
    </cac:Item>
    <cac:Price>
      <cbc:PriceAmount currencyID="MYR">46.00</cbc:PriceAmount>
    </cac:Price>
  </cac:InvoiceLine>
</ubl:Invoice>

处理后

发票
发票号码:INV20261107001(cbc:ID)
开具日期:2026-11-07(cbc:IssueDate)
开具时间:14:35:00(cbc:IssueTime)
发票类型:01 — invoice(cbc:InvoiceTypeCode)
代码列表版本:1.0(cbc:InvoiceTypeCode/@listVersionID)
文件货币:MYR / 税款货币:MYR

供应商
名称:Hoelee Enterprise
TIN(schemeID=TIN):C12345678901
BRN(schemeID=BRN):202501123456
SST(schemeID=SST):B16-1234567890
MSIC:62012
地址:12, Jalan Teknologi 3/1, Taman Sains, 63000 Cyberjaya, MYS
电话:+603-8311 0000 / 电邮:billing@hoelee.com

买方
名称:Restoran Aisyah Sdn. Bhd.
TIN(schemeID=TIN):C87654321090

税款
税款总额:37.40(cac:TaxTotal/cbc:TaxAmount)
税款小计 1:应税金额 400.00,税款 32.00,02 — service-tax,8.00%
税款小计 2:应税金额 54.00,税款 5.40,01 — sales-tax,10.00%

总额
行金额:454.00 / 不含税金额:454.00 / 含税金额:491.40
应付金额:491.40(cac:LegalMonetaryTotal/cbc:PayableAmount)
行金额之和:454.00(本阅读器把文件里几行的金额自己加总而得)

发票项目
第 1 行 · 编号 1 · Website maintenance service — November 2026
  030 · 10 EA · 单价 40.00 · 行金额 400.00 · 税款 32.00(02 — service-tax,8.00%)
第 2 行 · 编号 2 · IP camera 4MP — wired
  022 · 6 EA · 单价 9.00 · 行金额 54.00 · 税款 5.40(01 — sales-tax,10.00%)
第 3 行 · 编号 3 · E-commerce setup consultation
  022 · 1 EA · 单价 46.00 · 折扣 46.00(Trade discount — end of year)· 行金额 0.00 · 税款 0.00(06 — not-applicable)

这个文件里有什么 / 没有什么
- 供应商 TIN、BRN、SST、MSIC、地址、电话、电邮:有
- 买方名称和 TIN:有;买方 BRN、SST、NRIC:这个文件里没有
- 税款总额:有;税款小计:有 2 项;应付金额:有;发票项目:有 3 项
- 签名元素:没有

使用方法

  1. 把会计系统里的 XML 复制出来,粘贴进输入栏。下面的浏览器会把每个值连同它来自哪条 UBL 路径一起列出来。
  2. 按“开始处理”。输出栏是通俗易懂的摘要——抬头、供应商、买方、税款明细、总额和每一项项目——后面还有一份“有什么 / 没有什么”清单。“显示 UBL 路径”默认已勾选,取消勾选即可隐藏路径。“复制为”可在“纯文本”和“Markdown 表格”之间切换。
  3. 需要的话按“复制结果”。文件本身不会被改动,什么也不会被上传;打开网络标签页会看到零请求。

常见问题

这个工具会查我的发票是否合法或合规吗?

不会。它是阅读器:读出文件里有什么给你看,从不说一份文件合法、合规、已接受或已拒绝,也不计算 LHDN 会不会接受它。“有什么 / 没有什么”清单只报告有没有,所以“买方 BRN:这个文件里没有”是关于文件的事实,不是评判。

我手里已经有 XML,为什么还需要阅读器?

电子发票 XML 是带命名空间的元素树,人肉扫不过来:号码在 <cbc:ID>,应付金额在 <cac:LegalMonetaryTotal/cbc:PayableAmount>,每种税种一行小计。阅读器按人读发票的顺序打印出来,每个值都标注路径,打开表格之前就能一眼分清哪个字段是哪个。

哪个是 TIN、哪个是 BRN?

它们都是 <cac:PartyIdentification> 里的 <cbc:ID> 元素,靠 ID 元素上的 schemeID 属性区分:schemeID="TIN" 是税号,schemeID="BRN" 是公司注册号,schemeID="SST" 是销售税和服务税号。阅读器按文件里写的那样,把每个值旁边的 schemeID 原样列出。

为什么该有数字的地方显示的是横线?

文件里没有的可选元素就是没有,不是 0.00。阅读器不会替文件编一个看起来像金额的零。金额按文件里写的原样显示;唯一推导出来的数是几行的行金额之和,而且它会标注这是阅读器自己加的。

我的发票或买方的 TIN 会被上传吗?

不会。阅读器是浏览器里的静态 JavaScript:打开网络标签页会看到零请求。发票上带着真实的公司注册号和真实的税号,它们不会离开这台电脑。