Можно ли при импорте XML в Excel импортировать узел и его дочерние элементы в одну строку?Если да, как это можно сделать? - PullRequest
0 голосов
/ 18 июня 2019

Для использования Java Framework (MATSim) я хотел бы иметь возможность импортировать и экспортировать из XML в Excel (и Excel в XML). Для этого я использую и XSD File, но некоторые узлы должны появляться несколько раз.

Мои XML-файлы выглядят так:

<population>
    <attributes>
        <attribute name="coordinateReferenceSystem" class="java.lang.String" >EPSG:2154</attribute>
    </attributes>
<!-- ====================================================================== -->
    <person id="100007">
        <attributes>
            <attribute name="age" class="java.lang.Integer" >50</attribute>
        </attributes>
        <plan score="125.08754835604087" selected="no">
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00" >
            </activity>
            <leg mode="drt" dep_time="07:58:00" trav_time="00:30:09">
                <route type="drt" start_link="502570" end_link="146319" trav_time="00:30:09" distance="10233.148696149716">720.0 806.0</route>
            </leg>
            <activity type="w" link="146319" x="645036.2443" y="6868434.1435" end_time="18:17:12" >
            </activity>
            <leg mode="drt" dep_time="18:17:12" trav_time="00:31:42">
                <route type="drt" start_link="146319" end_link="502570" trav_time="00:31:42" distance="11558.582054437727">720.0 868.0</route>
            </leg>
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" >
            </activity>
        </plan>

        <plan score="129.66748741175877" selected="no">
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:37" >
            </activity>
            <leg mode="drt" dep_time="07:58:00" trav_time="00:30:09">
                <route type="drt" start_link="502570" end_link="146319" trav_time="00:30:25" distance="10233.148696149716">720.0 817.0967661750838</route>
            </leg>
            <activity type="w" link="146319" x="645036.2443" y="6868434.1435" end_time="18:12:16" >
            </activity>
            <leg mode="drt" dep_time="18:17:12" trav_time="00:31:42">
                <route type="drt" start_link="146319" end_link="502570" trav_time="00:31:47" distance="11558.582054437727">720.0 871.4448190285184</route>
            </leg>
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" >
            </activity>
        </plan>

        <plan score="129.02719843569574" selected="no">
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00" >
            </activity>
            <leg mode="drt" dep_time="07:58:00" trav_time="00:30:29">
                <route type="drt" start_link="502570" end_link="146319" trav_time="00:30:29" distance="10233.148696149716">720.0 819.4304164945643</route>
            </leg>
            <activity type="w" link="146319" x="645036.2443" y="6868434.1435" end_time="18:17:12" >
            </activity>
            <leg mode="drt" dep_time="18:17:12" trav_time="00:31:56">
                <route type="drt" start_link="146319" end_link="502570" trav_time="00:31:56" distance="11558.582054437727">720.0 877.3676952931855</route>
            </leg>
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" >
            </activity>
        </plan>

        <plan score="128.83469902010924" selected="no">
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="08:01:19" >
            </activity>
            <leg mode="drt" dep_time="07:58:00" trav_time="00:30:09">
                <route type="drt" start_link="502570" end_link="146319" trav_time="00:30:34" distance="10233.148696149716">720.0 823.0953896303872</route>
            </leg>
            <activity type="w" link="146319" x="645036.2443" y="6868434.1435" end_time="18:19:45" >
            </activity>
            <leg mode="drt" dep_time="18:17:12" trav_time="00:31:42">
                <route type="drt" start_link="146319" end_link="502570" trav_time="00:31:56" distance="11558.582054437727">720.0 877.956354092079</route>
            </leg>
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" >
            </activity>
        </plan>

        <plan score="125.08754835604087" selected="yes">
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00" >
            </activity>
            <leg mode="drt" dep_time="07:58:00" trav_time="00:30:41">
                <route type="drt" start_link="502570" end_link="146319" trav_time="00:30:41" distance="10233.148696149716">720.0 827.8504105620923</route>
            </leg>
            <activity type="w" link="146319" x="645036.2443" y="6868434.1435" end_time="18:17:12" >
            </activity>
            <leg mode="drt" dep_time="18:17:12" trav_time="00:32:03">
                <route type="drt" start_link="146319" end_link="502570" trav_time="00:32:03" distance="11558.582054437727">720.0 882.6003787117806</route>
            </leg>
            <activity type="h" link="502570" x="645800.341" y="6860736.1577" >
            </activity>
        </plan>

    </person>
</population>

Но в Excel это будет выглядеть следующим образом:

Фактический результат

Для одного плана он в конечном итоге будет отображаться на 5 разных строках, но я бы хотел, чтобы каждый план был только одной одной строкой

id, age, score, selected, type, link, x, y, end_time, mode, dep_time, trav_time, route, start_link, end_link, type, link, x, y, end_time, mode, dep_time, trav_time, route, start_link, end_link,  type, link, x, y, end_time

Я не против иметь одну строку на план, если я хочу, чтобы я мог разобрать их, но просто наличие всех данных в одной строке действительно изменит вещи и сделает их легко используемыми.

Я не знаю много о .XSD, я использовал только онлайн-конвертер для его создания.

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="population">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="person">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element minOccurs="0" name="attributes">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="attribute">
                                            <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:unsignedByte">
                                                        <xs:attribute name="name" type="xs:string" use="optional" />
                                                        <xs:attribute name="class" type="xs:string" use="optional" />
                                                    </xs:extension>
                                                </xs:simpleContent>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element minOccurs="0" maxOccurs="unbounded" name="plan">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:choice maxOccurs="unbounded">
                                            <xs:element minOccurs="0" maxOccurs="unbounded" name="activity">
                                                <xs:complexType>
                                                    <xs:attribute name="type" type="xs:string" use="optional" />
                                                    <xs:attribute name="link" type="xs:unsignedInt" use="optional" />
                                                    <xs:attribute name="x" type="xs:decimal" use="optional" />
                                                    <xs:attribute name="y" type="xs:decimal" use="optional" />
                                                    <xs:attribute name="end_time" type="xs:time" use="optional" />
                                                </xs:complexType>
                                            </xs:element>
                                            <xs:element minOccurs="0" maxOccurs="unbounded" name="leg">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element minOccurs="0" name="route">
                                                            <xs:complexType>
                                                                <xs:simpleContent>
                                                                    <xs:extension base="xs:string">
                                                                        <xs:attribute name="type" type="xs:string" use="optional" />
                                                                        <xs:attribute name="start_link" type="xs:unsignedInt" use="optional" />
                                                                        <xs:attribute name="end_link" type="xs:unsignedInt" use="optional" />
                                                                        <xs:attribute name="trav_time" type="xs:time" use="optional" />
                                                                        <xs:attribute name="distance" type="xs:decimal" use="optional" />
                                                                    </xs:extension>
                                                                </xs:simpleContent>
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                    <xs:attribute name="mode" type="xs:string" use="optional" />
                                                    <xs:attribute name="dep_time" type="xs:time" use="optional" />
                                                    <xs:attribute name="trav_time" type="xs:time" use="optional" />
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:choice>
                                    </xs:sequence>
                                    <xs:attribute name="score" type="xs:decimal" use="optional" />
                                    <xs:attribute name="selected" type="xs:string" use="optional" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="id" type="xs:unsignedInt" use="optional" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Я пытался изменить число «minOccurs» и «maxOccurs», но оно не дало ожидаемого результата, и, насколько я знаю, я даже не знаю, возможно ли это сделать.

Большое спасибо за потраченное время.

1 Ответ

0 голосов
/ 18 июня 2019

В вашем XSD есть две ошибки:

  1. Вам не хватает скопировать определение <attributes> перед элементом <plan> (перед вашим разделителем <!-- =====...==== -->)

  2. Для complexType элемента <activity> требуется атрибут mixed="true", поскольку

    Элемент смешанного сложного типа может содержатьатрибуты, элементы и текст.

Таким образом, весь XSD должен выглядеть следующим образом (эти два изменения помечены комментарием):

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Technologies Online Tools 1.0 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="population">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="attributes"> <!-- Added for solution -->
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element minOccurs="0" name="attribute">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="xs:unsignedByte">
                                            <xs:attribute name="name" type="xs:string" use="optional" />
                                            <xs:attribute name="class" type="xs:string" use="optional" />
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element minOccurs="0" name="person">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element minOccurs="0" name="attributes">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="attribute">
                                            <xs:complexType>
                                                <xs:simpleContent>
                                                    <xs:extension base="xs:unsignedByte">
                                                        <xs:attribute name="name" type="xs:string" use="optional" />
                                                        <xs:attribute name="class" type="xs:string" use="optional" />
                                                    </xs:extension>
                                                </xs:simpleContent>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element minOccurs="0" maxOccurs="unbounded" name="plan">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:choice maxOccurs="unbounded">
                                            <xs:element minOccurs="0" maxOccurs="unbounded" name="activity"> 
                                                <xs:complexType mixed="true">   <!-- Added for solution -->
                                                    <xs:attribute name="type" type="xs:string" use="optional" />
                                                    <xs:attribute name="link" type="xs:unsignedInt" use="optional" />
                                                    <xs:attribute name="x" type="xs:decimal" use="optional" />
                                                    <xs:attribute name="y" type="xs:decimal" use="optional" />
                                                    <xs:attribute name="end_time" type="xs:time" use="optional" />
                                                </xs:complexType>
                                            </xs:element>
                                            <xs:element minOccurs="0" maxOccurs="unbounded" name="leg">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element minOccurs="0" name="route">
                                                            <xs:complexType>
                                                                <xs:simpleContent>
                                                                    <xs:extension base="xs:string">
                                                                        <xs:attribute name="type" type="xs:string" use="optional" />
                                                                        <xs:attribute name="start_link" type="xs:unsignedInt" use="optional" />
                                                                        <xs:attribute name="end_link" type="xs:unsignedInt" use="optional" />
                                                                        <xs:attribute name="trav_time" type="xs:time" use="optional" />
                                                                        <xs:attribute name="distance" type="xs:decimal" use="optional" />
                                                                    </xs:extension>
                                                                </xs:simpleContent>
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                    <xs:attribute name="mode" type="xs:string" use="optional" />
                                                    <xs:attribute name="dep_time" type="xs:time" use="optional" />
                                                    <xs:attribute name="trav_time" type="xs:time" use="optional" />
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:choice>
                                    </xs:sequence>
                                    <xs:attribute name="score" type="xs:decimal" use="optional" />
                                    <xs:attribute name="selected" type="xs:string" use="optional" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="id" type="xs:unsignedInt" use="optional" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Чтобы избежать необходимости в смешанном контенте, вам нужно изменить элемент <activity>, чтобы он не содержал никакого содержимого (даже пробела).Таким образом, вы можете изменить

<activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00">
            </activity>

на

<activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00" />

или

<activity type="h" link="502570" x="645800.341" y="6860736.1577" end_time="07:58:00"></activity>

Но с существующим пробелом вы должны использовать атрибут mixed="true" вcomplexType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...