我有一组要导出到KML的事件。这些事件具有嵌套的属性和基数大于1的属性(maxOccur> 1)。
这是一个以JSON表示的事件的示例:
{
"id": 1,
"date": "2018-01-01",
"client": {
"name": "Brad",
"since": "2017-12-01"
},
"products": [
{
"name": "P1",
"quantity": 20
},
{
"name": "P2",
"quantity": 40
},
]
}
我们正在考虑的一个选项是在ExtendedData中使用任意XML。此选项听起来对机器到机器的数据交换很有用,但对人工读取却不利,因为“ Google地球”无法在气球中很好地显示这些数据:
<ExtendedData>
<id>1</id>
<date>2018-01-01</date>
<client>
<name>Brad</name>
<since>2017-12-01</since>
</client>
<products>
<product>
<name>P1</name>
<quantity>20</quantity>
</product>
<product>
<name>P2</name>
<quantity>40</quantity>
</product>
</products>
</ExtendedData>
我们正在考虑的其他选项是使用Schema + SchemaData + BallonStyle,但是不支持基数和嵌套属性...
<Schema name="myEvent" id="myEvent">
<SimpleField type="int" name="id">
<displayName>Event id</displayName>
</SimpleField>
<SimpleField type="string" name="date">
<displayName>Event date</displayName>
</SimpleField>
<!-- workaround to nested data -->
<SimpleField type="string" name="clientName">
<displayName>Client name</displayName>
</SimpleField>
<SimpleField type="string" name="clientSince">
<displayName>Client since</displayName>
</SimpleField>
<!-- no idea how present attributes with more than one occurrence -->
</Schema>
还有另一个我们应该考虑的选择吗?
答案 0 :(得分:2)
KML ExtendedData中的数据和SimpleData元素仅限于名称/值对,其值以文本形式出现,但允许使用不同的名称空间来定制XML。
您可以从非KML XML名称空间(例如Dublin核心,RDF或您自己的名称空间)向KML中的功能添加任意XML数据。这是相关的tutorial。
以下是在KML中使用任意都柏林核心XML的示例:
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>ExtendedData Test with Dublin core XML</name>
<Placemark>
<name>Test data</name>
<ExtendedData xmlns:ns="http://example.org/myapp/">
<ns:metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:description>
KML features a rich mix of
metadata information and services for the XML community.
</dc:description>
<dc:subject>XML, RDF, metadata, information
syndication services</dc:subject>
<dc:identifier>http://earth.google.com</dc:identifier>
<dc:language>en-us</dc:language>
<dc:date>2000-10-13</dc:date>
<dc:rights>Copyright 2000, O'Reilly Network</dc:rights>
<dc:publisher>O'Reilly and Associates, Inc.</dc:publisher>
</ns:metadata>
</ExtendedData>
<Point>
<coordinates>-71.7571,42.953</coordinates>
</Point>
</Placemark>
</Document>
</kml>
使用您自己的命名空间,您可以存储任何嵌套的XML。
<Placemark>
<name>Test data</name>
<ExtendedData>
<data xmlns="urn:my.org:data">
<id>1</id>
<date>2018-01-01</date>
<client>
<name>Brad</name>
<since>2017-12-01</since>
</client>
<products>
<product>
<name>P1</name>
<quantity>20</quantity>
</product>
<product>
<name>P2</name>
<quantity>40</quantity>
</product>
</products>
</data>
</ExtendedData>
</Placemark>
但是请注意,由于Google Earth既不处理也不显示此类数据,因此该方法沿KML传递数据进行机器对机器交换。第三方应用程序可以利用KML中包含的这种XML数据。
如果您希望至少部分数据可以通过Google Earth进行人类阅读,请考虑使用混合解决方案,其中在Data / value元素中使用名称/值对(用于简单值),在定制XML元素中用于更复杂的嵌套XML数据。
<Placemark>
<name>Test data</name>
<ExtendedData>
<Data name="id">
<value>123</value>
</Data>
<Data name="date">
<value>2018-01-01</value>
</Data>
<customData xmlns="urn:custom">
<client>
<name>Brad</name>
<since>2017-12-01</since>
</client>
</customData>
</ExtendedData>
<Point>
<coordinates>-71.7571,42.953</coordinates>
</Point>
</Placemark>