You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理XML中的@符号与#agg?从Excel重建XML Schema遇困

从Excel表头重建XML与对应的XSD Schema

首先,你的Excel表头其实是简化的XPath路径,里面的特殊符号有明确的含义:

  • @xxx 表示元素的属性,比如/tns:Faktura/@typ就是<Faktura>元素的typ属性
  • #agg 这里应该是表头用来标记这个是<P_13_1>元素的特殊实例(比如聚合值标识),因为标准XPath里没有#开头的语法,结合你的数据来看,它和前面的P_13_1值相同,对应一个带属性的同名元素。

第一步:构建正确的XML结构

先修正你写的XML错误,基于一行数据生成符合逻辑的XML节点:

比如第一行数据G 2018-07-04 false false 380 380对应的XML应该是:

<?xml version="1.0" encoding="UTF-8"?>
<JPK_FAS_SALES_INVOICES xmlns:tns="http://your-custom-namespace.com" 
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xsi:schemaLocation="http://your-custom-namespace.com your-schema-file.xsd">
  <tns:Faktura typ="G">
    <tns:P_1>2018-07-04</tns:P_1>
    <tns:P_106E_2>false</tns:P_106E_2>
    <tns:P_106E_3>false</tns:P_106E_3>
    <tns:P_13_1>380</tns:P_13_1>
    <tns:P_13_1 agg="true">380</tns:P_13_1> <!-- 用agg属性标记#agg对应的列 -->
  </tns:Faktura>
  <!-- 其他行数据对应更多<tns:Faktura>节点 -->
</JPK_FAS_SALES_INVOICES>

⚠️ 注意:

  • 必须给tns前缀绑定一个实际的命名空间(比如上面的http://your-custom-namespace.com),这是XML Schema的规范要求
  • <tns:Faktura>的typ属性来自第一列,元素内部不需要重复写G,而是包含子元素
  • #agg列对应的<tns:P_13_1>通过添加agg="true"属性来区分,你也可以根据实际需求调整属性名(比如id="agg")

第二步:编写对应的XML Schema(XSD)

针对你给出的6列,我先写一个基础的XSD模板,你只需要扩展剩下的100列即可:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           targetNamespace="http://your-custom-namespace.com"
           xmlns:tns="http://your-custom-namespace.com"
           elementFormDefault="qualified">

  <!-- 根元素定义:包含多个Faktura节点 -->
  <xs:element name="JPK_FAS_SALES_INVOICES">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Faktura" type="tns:FakturaType" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- Faktura元素的类型定义 -->
  <xs:complexType name="FakturaType">
    <xs:sequence>
      <!-- P_1:日期类型 -->
      <xs:element name="P_1" type="xs:date"/>
      <!-- P_106E_2/3:布尔类型 -->
      <xs:element name="P_106E_2" type="xs:boolean"/>
      <xs:element name="P_106E_3" type="xs:boolean"/>
      <!-- P_13_1:允许出现两次,可选带agg属性 -->
      <xs:element name="P_13_1" maxOccurs="2">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:decimal">
              <xs:attribute name="agg" type="xs:boolean" use="optional"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <!-- 在这里添加剩下的100个元素定义,按照表头的XPath对应即可 -->
    </xs:sequence>
    <!-- Faktura的typ属性:必填项 -->
    <xs:attribute name="typ" type="xs:string" use="required"/>
  </xs:complexType>

</xs:schema>

关键问题的处理说明

  1. 如何处理@typ这类属性:在XSD中用<xs:attribute>标签定义元素的属性,use="required"表示这个属性必须存在(对应Excel第一列的数据不能为空)。
  2. 如何处理#agg这类特殊标记:因为你的Excel里P_13_1和#agg是两列,对应两个<P_13_1>元素,所以在XSD中给P_13_1设置maxOccurs="2"允许它出现两次,同时添加可选的agg属性来标记聚合值的实例。
  3. 扩展到106列的方法:
    • 如果表头是/tns:Faktura/@xxx:在FakturaType中添加<xs:attribute>定义
    • 如果表头是/tns:Faktura/tns:xxx:在FakturaType的<xs:sequence>中添加<xs:element>定义
    • 如果是类似#xxx的特殊标记:判断是属性还是同名元素,对应调整元素的属性规则或出现次数

内容的提问来源于stack exchange,提问作者wiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:25:04