gpt4 book ai didi

xml - 引用 XML 数据库文件

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:29 27 4
gpt4 key购买 nike

问题

假设我们在 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 数据库的附加属性。

可能的方法

到目前为止,我能想到的有两种选择:

  1. 天真的方法:分配 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>
  2. 将 XPath 引用保存到“属性”文件中的原始数据。这有意义吗?如何做到这一点?

此外,欢迎提出更好的建议。

最佳答案

如果您不想修改原始数据库 xml,那么在原始数据上强制使用唯一 ID 将要求您做您不想做的事情。然而,xpath 的想法需要更多的努力来解决深层嵌套的元素。

<?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"?>
<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 是令人讨厌的。特别是当您只想更新原因并附加“状态”属性时。 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 数据库文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com