引用 XML 数据库文件
Referencing a XML database file
问题
假设我们在 XML 文件中有一些数据,例如人名记录:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" />
<person name="Bob" />
</persons>
此数据被视为我们不想更改的静态数据库。
现在我们要为每个项目(此处为:人)附加一个属性。例如,我们可以存储我们以前是否见过这个人。当然,你可以这样做:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" met="true" />
<person name="Bob" met="false" />
</persons>
但是,这会更改原始文件。我们想要第二个引用主数据库并使用附加属性扩展它的文件。
我正在寻找一种优雅的、概念上令人满意的(甚至是标准的?)实现方法,而不仅仅是任何可行的方法。以上只是一个简化的例子。
本质上,问题是如何存储我们不想直接更改的现有外部 XML 数据库的附加属性。
可能的方法
到目前为止,我能想到的有两个方案:
天真的方法:分配UUID并使用它们来引用原始数据:
<!-- Main file -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" id="1234" />
<person name="Bob" id="1235" />
</persons>
<!-- Additional data -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr id="1234" met="true" />
<attr id="1235" met="false" />
</attributes>
将 XPath 引用保存到 'attributes' 文件中的原始数据。这有意义吗?如何做到这一点?
另外,欢迎提出更好的建议。
如果您不想修改原始数据库 xml,那么在原始数据上强制使用唯一 ID 将要求您做您不想做的事情。然而,xpath 的想法需要更多的努力来解决深层嵌套的元素。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" />
<person name="Bob" />
</persons>
是一个简单的示例,您可以在其中附加 via
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/persons/person[@name='Alice']" met="true" />
<attr path="/persons/person[@name='Bob']" met="false" />
</attributes>
这非常优雅,因为您可以随心所欲地使用一些值。
举一个稍微复杂一点的例子,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<service-calls>
<companyA>
<floor num="1">
<error type="bsod" cause="unknown" />
</floor>
<floor num="1">
<error type="bsod" cause="unknown" />
</floor>
<floor num="3">
<error type="bsod" cause="unknown" />
</floor>
</companyA>
<companyB>
<floor num="2">
<error type="bsod" cause="unknown" />
</floor>
<floor num="4">
<error type="bsod" cause="unknown" />
</floor>
<floor num="4">
<error type="bsod" cause="unknown" />
</floor>
</companyB>
</service-calls>
通过并为其中的每一个添加一个唯一的 ID 是令人讨厌的。特别是当您只想更新原因并附加 "status" 属性时。 xpath 再次!为此,你可以在A公司拿到一楼的票,在B公司拿到四楼的票(不管什么原因)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/service-calls/companyA/floor[@num='1']/error" status="fixed"
cause="user clicked malformed attachment" />
<attr path="/service-calls/companyB/floor[@num='4']/error" status="replaced computer"
cause="malware worm" />
</attributes>
无论哪种方式,这似乎都是最优雅的方法。
如果你想在地板上贴笔记,你也可以这样做:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/service-calls/companyA/floor[@num='1']" type="developers who cause trouble" />
<attr path="/service-calls/companyB/floor[@num='4']" type="accounting" />
</attributes>
问题
假设我们在 XML 文件中有一些数据,例如人名记录:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" />
<person name="Bob" />
</persons>
此数据被视为我们不想更改的静态数据库。
现在我们要为每个项目(此处为:人)附加一个属性。例如,我们可以存储我们以前是否见过这个人。当然,你可以这样做:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" met="true" />
<person name="Bob" met="false" />
</persons>
但是,这会更改原始文件。我们想要第二个引用主数据库并使用附加属性扩展它的文件。
我正在寻找一种优雅的、概念上令人满意的(甚至是标准的?)实现方法,而不仅仅是任何可行的方法。以上只是一个简化的例子。
本质上,问题是如何存储我们不想直接更改的现有外部 XML 数据库的附加属性。
可能的方法
到目前为止,我能想到的有两个方案:
天真的方法:分配UUID并使用它们来引用原始数据:
<!-- Main file --> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persons> <person name="Alice" id="1234" /> <person name="Bob" id="1235" /> </persons> <!-- Additional data --> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <attributes> <attr id="1234" met="true" /> <attr id="1235" met="false" /> </attributes>
将 XPath 引用保存到 'attributes' 文件中的原始数据。这有意义吗?如何做到这一点?
另外,欢迎提出更好的建议。
如果您不想修改原始数据库 xml,那么在原始数据上强制使用唯一 ID 将要求您做您不想做的事情。然而,xpath 的想法需要更多的努力来解决深层嵌套的元素。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person name="Alice" />
<person name="Bob" />
</persons>
是一个简单的示例,您可以在其中附加 via
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/persons/person[@name='Alice']" met="true" />
<attr path="/persons/person[@name='Bob']" met="false" />
</attributes>
这非常优雅,因为您可以随心所欲地使用一些值。
举一个稍微复杂一点的例子,
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<service-calls>
<companyA>
<floor num="1">
<error type="bsod" cause="unknown" />
</floor>
<floor num="1">
<error type="bsod" cause="unknown" />
</floor>
<floor num="3">
<error type="bsod" cause="unknown" />
</floor>
</companyA>
<companyB>
<floor num="2">
<error type="bsod" cause="unknown" />
</floor>
<floor num="4">
<error type="bsod" cause="unknown" />
</floor>
<floor num="4">
<error type="bsod" cause="unknown" />
</floor>
</companyB>
</service-calls>
通过并为其中的每一个添加一个唯一的 ID 是令人讨厌的。特别是当您只想更新原因并附加 "status" 属性时。 xpath 再次!为此,你可以在A公司拿到一楼的票,在B公司拿到四楼的票(不管什么原因)。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/service-calls/companyA/floor[@num='1']/error" status="fixed"
cause="user clicked malformed attachment" />
<attr path="/service-calls/companyB/floor[@num='4']/error" status="replaced computer"
cause="malware worm" />
</attributes>
无论哪种方式,这似乎都是最优雅的方法。
如果你想在地板上贴笔记,你也可以这样做:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<attributes>
<attr path="/service-calls/companyA/floor[@num='1']" type="developers who cause trouble" />
<attr path="/service-calls/companyB/floor[@num='4']" type="accounting" />
</attributes>