当前位置: 首页 > 知识库问答 >
问题:

从Saxon中的XQueryEvaluator获取序列化属性

王宏深
2023-03-14

我以前问过这个问题,但现在我试图获得XQuery计算的序列化属性,而不是XSLT转换。

使用此代码:

public static void main(String[] args) throws SaxonApiException {
    Processor p = new Processor(false);
    XQueryEvaluator e = p.newXQueryCompiler().compile(
            "xquery version \"3.0\";" +
            "declare namespace output = \"http://www.w3.org/2010/xslt-xquery-serialization\"; " +
            "declare option output:encoding \"utf-8\";" +
            "<x s='ó'/>").load();
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    Serializer s = p.newSerializer(os);
    e.setDestination(s);
    e.run();
    assert "utf-8".equals(s.getCombinedOutputProperties(null).getProperty("encoding")); //fails
}

原始问题答案中提出的方法似乎不适用于这里,因为我无法从XQueryEvaluator实例化序列化程序,而getDeclaredSerializationProperties只能在XSLT上下文中使用。

我用的是萨克森10他。

共有2个答案

芮化
2023-03-14

如果您将序列化器子类化,并重写方法getReceiver,以访问/存储传入该方法的序列化参数,则可能:

public class MySerializer extends Serializer {

    public MySerializer(Processor processor) {
        super(processor);
    }
    
    
    private SerializationProperties mySerProps;
    
    public SerializationProperties getSerProps() {
        return mySerProps;
    }
    @Override
    public Receiver getReceiver(PipelineConfiguration arg0, SerializationProperties arg1) throws SaxonApiException {
        mySerProps = arg1;
        return super.getReceiver(arg0, arg1);
    }

}

然后使用例如。

        MySerializer s = new MySerializer(p);
        s.setOutputStream(os);
        e.setDestination(s);
        e.run();
        assert "utf-8".equals(s.getSerProps().getProperty("encoding")); 
万俟靖
2023-03-14

从可执行的查询:

e.getUnderlyingCompiledQuery().getExecutable().getPrimarySerializationProperties()

我无法立即从XQueryEvaluator中找到一种方法,但由于XQueryEvaluator总是通过调用load()从xqueryexecuteable创建的,因此您应该能够从那里开始。

 类似资料:
  • 我有以下XSL样式表: 我正在使用Saxon 9.9对其进行如下转换。 我希望返回值是样式表中指定的“UTF-8”,但它返回null。(序列化程序实例似乎根本没有属性。)这是为什么?获取输出属性的正确方法是什么?

  • 问题内容: 我有一个对象,该对象正在使用ServiceStack.Text命名空间中的方法进行反序列化。 如何在序列化过程中忽略所有唯一属性?有没有类似属性或可以用来装饰属性的东西,可以将其省略? 谢谢 问题答案: ServiceStack的文本序列化程序遵循.NET的DataContract序列化程序行为,这意味着您可以使用opt- out 属性忽略数据成员 选择加入的方法是装饰要序列化的每个属

  • 问题内容: 我如何才能序列化一个特定的属性,但又防止其反序列化回POCO?是否可以使用属性装饰特定属性? 基本上,我正在寻找一个与ShouldSerialize *方法等效的反序列化方法。 我知道我可以编写一个自定义转换器,但是这样做似乎有点过头了。 编辑: 这里还有一些背景。这背后的原因是我的课看起来像: 我需要请求的属性,但是我不希望它反序列化并触发设置程序逻辑。 问题答案: 最简单的方法是将

  • 我的问题是这个问题的延伸。 要获得属性列表,我们可以使用以下代码: 但是如果我想得到100个不同的属性。 选项#1: 那么,重写这一行100次会更好吗?或者我应该简单地运行1个循环并收集那里的所有属性。 选项2:

  • ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为java.util.HashMap 提前谢了。