如何处理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>
关键问题的处理说明
- 如何处理
@typ这类属性:在XSD中用<xs:attribute>标签定义元素的属性,use="required"表示这个属性必须存在(对应Excel第一列的数据不能为空)。 - 如何处理
#agg这类特殊标记:因为你的Excel里P_13_1和#agg是两列,对应两个<P_13_1>元素,所以在XSD中给P_13_1设置maxOccurs="2"允许它出现两次,同时添加可选的agg属性来标记聚合值的实例。 - 扩展到106列的方法:
- 如果表头是
/tns:Faktura/@xxx:在FakturaType中添加<xs:attribute>定义 - 如果表头是
/tns:Faktura/tns:xxx:在FakturaType的<xs:sequence>中添加<xs:element>定义 - 如果是类似
#xxx的特殊标记:判断是属性还是同名元素,对应调整元素的属性规则或出现次数
- 如果表头是
内容的提问来源于stack exchange,提问作者wiro
相关产品推荐
相关产品推荐

