【问题标题】:Xerces-C++ XMLString::patternMatch() not functioning correctlyXerces-C++ XMLString::patternMatch() 无法正常运行
【发布时间】:2021-03-19 23:13:09
【问题描述】:

我正在尝试找到一种方法来匹配 C++ 中的字符串与 XML Schema 正则表达式。 std::regex 不支持 XML Schema regex grammar,因此我安装了 Xerces-C++ XML 库以使用其模式匹配功能。不幸的是,即使是一个基本的例子,它似乎也不能正常工作。

#include <iostream>
#include <xercesc/util/XMLString.hpp>

using namespace XERCES_CPP_NAMESPACE;

int main()
{
    try
    {
        XMLPlatformUtils::Initialize();
    }
    catch (const XMLException& ex)
    {
        char* message = XMLString::transcode(ex.getMessage());
        std::cerr << "Error during Xerces-c Initialization.\n"
            << "  Exception message:"
            << message;
        XMLString::release(&message);
        return 1;
    }

    const XMLCh* str = XMLString::transcode("bcdfg");

    // Implement a simple regex that uses "character class subtraction"
    // Should match any string that does not contain vowels
    const XMLCh* pattern = XMLString::transcode("[a-z-[aeiuo]]+");

    if (XMLString::patternMatch(str, pattern) != -1)
    {
        std::cout << "Match!" << std::endl;
    }
    else
    {
        std::cout << "No match." << std::endl;
    }

    XMLPlatformUtils::Terminate();
    return 0;
}

输出: 没有匹配。

如果我编写一个非常简单的不使用字符类减法的正则表达式,它似乎确实有效。但问题是我需要字符类减法才能工作,因为我需要支持任何符合 XML Schema 正则表达式语法的可能正则表达式。

Xerces 的文档非常不清楚,并且没有指定该函数使用哪种正则表达式语法,但我假设因为它是一个 XML 解析库,它将实现 XML 正则表达式。也许这个假设是错误的?

编辑:

从我需要支持的 XSD 文件中添加一个实际正则表达式的示例。此示例来自定义 XML 模式支持的基本数据类型的模式。规范可以在这里找到:https://www.w3.org/TR/xmlschema-2/#conformance

我需要解析的正则表达式示例使用字符类减法(以及特殊的\c\i 字符组显示在下面“NCName”数据类型的xs:pattern 限制中:

  <xs:simpleType name="NCName" id="NCName">
    <xs:annotation>
      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NCName"/>
    </xs:annotation>
    <xs:restriction base="xs:Name">
      <xs:pattern value="[\i-[:]][\c-[:]]*" id="NCName.pattern">
        <xs:annotation>
          <xs:documentation
               source="http://www.w3.org/TR/REC-xml-names/#NT-NCName">
            pattern matches production 4 from the Namespaces in XML spec
          </xs:documentation>
        </xs:annotation>
      </xs:pattern>
    </xs:restriction>
  </xs:simpleType>

【问题讨论】:

  • 并非所有解析情况都适合正则表达式。
  • 对不起,我不确定我是否说清楚了,我不是在尝试解析 XML 文件本身,我只是尝试使用 XML Schema 正则表达式语法来解析字符串。
  • 你的意图还不清楚。您是否希望支持超出W3C XML Schema Definition Language (XSD) 指定的正则表达式功能?这是不可取的,因为它不再是标准的 XSD。
  • @kjhughes,我正在寻找一种方法来支持这些功能,仅此而已。字符类减法是 XML Schema 正则表达式的一部分。几周以来,我一直在努力寻找一种在 C++ 中支持 XML Schema 正则表达式的方法,我希望像 Xerces 这样的专用 XML 解析库可以解决这个问题:(
  • 您能否edit 您的问题并添加一个使用您声称遵守 W3C 标准但 Xerces 不支持的正则表达式的 XSD?出现该问题的最小的此类 XSD 和随附的 XML 文档实例将是理想的。

标签: c++ xml xsd xerces-c


【解决方案1】:

好的,所以我无法让Xerces 正则表达式工作,而且文档也很糟糕,所以我决定尝试另一个库。 libxml2 有 XML 正则表达式,虽然 regex 功能的文档同样糟糕透顶,但我还是得到了一个工作程序。

#include <iostream>
#include <libxml/xmlregexp.h>

int main()
{
    LIBXML_TEST_VERSION;

    xmlChar* str = xmlCharStrdup("bcdfg");
    xmlChar* pattern = xmlCharStrdup("[a-z-[aeiou]]+");
    xmlRegexp* regex = xmlRegexpCompile(pattern);

    if (xmlRegexpExec(regex, str) == 1)
    {
        std::cout << "Match!" << std::endl;
    }

    free(regex);
    free(pattern);
    free(str);
}

输出:

匹配!

我想即使它没有回答如何让正则表达式与Xerces 一起正常工作,但这个答案可能会帮助其他正在寻求解决让 XML Schema 正则表达式在 C++ 中工作的相同问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2015-12-08
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多