如何通过引用XML-1并添加<year>和<price>元素创建XML-2?
如何通过引用XML-1创建带和的XML-2
嘿,这个需求很合理——把基础书籍信息(XML-1)和额外的元数据(年份、价格)分开存储,既能保持数据的单一来源,又能灵活扩展。下面给你两种实用的实现方案:
方案1:使用XInclude(W3C标准推荐)
XInclude是专门用来在XML中包含其他XML文档的标准方式,兼容性强,也更易维护。
首先,XML-1保持原样,保存为books_base.xml:
<bookstore> <book category="children"> <title>Harry Potter</title> <author>J K. Rowling</author> </book> <book category="web"> <title>Learning XML</title> <author>Erik T. Ray</author> </book> </bookstore>
然后创建XML-2,通过<xi:include>引入XML-1,并为每本书添加<year>和<price>元素。这里需要注意声明XInclude的命名空间:
<bookstore xmlns:xi="http://www.w3.org/2001/XInclude"> <!-- 引入XML-1的内容 --> <xi:include href="books_base.xml" parse="xml"/> <!-- 为每本书补充元数据 --> <book category="children"> <year>1997</year> <price>29.99</price> </book> <book category="web"> <year>2003</year> <price>39.95</price> </book> </bookstore>
提示:如果你的XML处理器支持XInclude,它会自动把引入的内容合并进来,最终效果和直接编写完整XML一致。
方案2:使用XML实体引用(传统方式)
这种方式利用XML的实体机制,适合简单场景或者需要兼容旧系统的情况。
同样先把XML-1保存为books_base.xml,然后在XML-2中定义一个实体指向它,再引用实体并添加元数据:
<!DOCTYPE bookstore [ <!-- 定义实体,指向XML-1文件 --> <!ENTITY books_base SYSTEM "books_base.xml"> ]> <bookstore> <!-- 引用实体,插入XML-1的内容 --> &books_base; <!-- 补充年份和价格 --> <book category="children"> <year>1997</year> <price>29.99</price> </book> <book category="web"> <year>2003</year> <price>39.95</price> </book> </bookstore>
提示:实体引用需要XML处理器支持外部实体解析,有些安全严格的环境可能会禁用,使用时要注意环境配置。
两种方案都实现了“不复制XML-1内容,通过引用/包含扩展数据”的需求,你可以根据自己的XML处理工具和场景选择合适的方式~
内容的提问来源于stack exchange,提问作者Slava Mokerov
相关产品推荐
相关产品推荐

