【问题标题】:How to read an XML with libXML2 using no string functions?如何使用不使用字符串函数的 libXML2 读取 XML?
【发布时间】:2016-07-15 22:25:47
【问题描述】:

本质上,我有多个用于文件格式的 XSD 文件,因为它是配置程序的主要方法,所以我需要带有英文字符串的版本、带有德语字符串的版本等。如果文件在其 @ 987654321@ 它正在使用的 XSD 语句,看来我应该能够在不进行字符串比较的情况下通过它。

例如我想避免这样做:

xmlNodePtr cur = xmlDocGetRootElement(doc);
if(!xmlStrncmp(cur->name, (const xmlChar *) "settings"))
{
    // do things
}

因为字符串“settings”会根据使用的 xsd 文件而改变,它可能是“paramètres”或“einstellungen”等。通常这是使用单独的 stings 文件完成的,但似乎 xsd 具有所有用作该字符串文件所需的信息。

但是,尚不清楚例如,如果 XSD 将元素中的第 n 个属性定义为带有默认值的可选,当我迭代时,libxml2 会告诉我它是第 n 个属性,并给它默认值节点中的属性?

类似地,似乎应该有一种方法可以找出一个元素是 <xs:choice> 中的第 n 个元素或 <xs:enumeration> 中的第 n 个元素,但我终生无法弄清楚如何去做吧。

例如在此枚举中:

<xs:restrict base="xs:string">
     <xs:enumeration value="glucose"/>
     <xs:enumeration value="fructose"/>
     <xs:enumeration value="sucrose"/>
<xs:restrict>

“葡萄糖”将是 0,“果糖”1,“蔗糖”2,依此类推。

有没有合适的方法来做到这一点?

【问题讨论】:

  • 即使在您将问题中的元素格式化为代码以便它们出现之后,我仍然无法说出您在问什么。听起来您希望验证消息引用索引而不是组件名称。是这样吗?很难知道。短语 nth attribute 没有意义,因为属性没有顺序,并且 如果文件在其 &lt;schema&gt; 语句中说它正在使用哪个 XSD,我似乎应该能够通过它没有进行字符串比较也很难解释。投票结束,因为不清楚您的要求,直到得到更好的解释。

标签: c xml xsd libxml2


【解决方案1】:

您的麻烦源于您做出的设计决定,即维护具有语义相同组件但词法不同名称的并行 XSD。

不要那样做。

这是一个糟糕的设计决定,它会破坏标准 XML 词汇表的好处。选择一种命名约定,包括一种自然语言,并始终如一地使用它。

保存 I18N 以翻译 content(请参阅 Best Practices for XML Internationalization),而不是 标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多