标签: stx

XSL与Xalan与STX与Joost

与使用STX(使用Joost)相比,我在哪里可以找到使用XSLT(使用Xalan)的非平凡示例的性能指标(内存/时间)

xslt performance xalan stx

6
推荐指数
1
解决办法
1902
查看次数

使用XSLT进行XML提取而不必将整个DOM树读入内存?

我有一种情况,我想从一些非常大但常规的XML文件中提取一些信息(只需要使用500 Mb文件),并且XSLT将是完美的.

不幸的是,我所知道的那些XSLT实现(除了最昂贵的Saxon版本之外)不支持只读取DOM的必要部分,而是读取整个树.这导致计算机交换死亡.

有问题的XPath是

//m/e[contains(.,'foobar')
Run Code Online (Sandbox Code Playgroud)

所以它基本上只是一个grep.

是否有可以执行此操作的XSLT实现?或者给出合适的"建议"的XSLT实现可以修复内存中不再需要的部分吗?

我更喜欢Java实现,但Windows和Linux都是可行的本机平台.


编辑:输入XML看起来像:

<log>
<!-- Fri Jun 26 12:09:27 CEST 2009 -->
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Registering Catalina:type=Manager,path=/axsWHSweb-20090626,host=localhost</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Force random number initialization starting</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Getting message digest component for algorithm MD5</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>Completed getting message digest component</m></e>
<e h='12:09:27,284' l='org.apache.catalina.session.ManagerBase' z='1246010967284' t='ContainerBackgroundProcessor[StandardEngine[Catalina]]' v='10000'>
<m>getDigest() 0</m></e>
......
</log>
Run Code Online (Sandbox Code Playgroud)

Essentialy我想选择一些m节点(我知道XPath是错误的,它只是一个快速的黑客),但保持XML布局.


编辑:似乎STX可能是我正在寻找的(我可以使用另一种转换语言),并且Joost是一个实现.有经验吗?


编辑:我发现带有-Xmx1500m的Saxon 6.5.4可以加载我的XML,所以这让我现在可以使用我的XPath.这只是一个幸运的中风所以我仍然想要一般性地解决这个问题 - 这意味着可编写脚本,这反过来意味着首先没有手工制作的Java过滤.


编辑:哦,顺便说一下.这是一个非常类似于log4j XMLLayout生成的日志文件.XML的原因是能够做到这一点,即对日志进行查询.这是最初的尝试,因此是一个简单的问题.后来我希望能够提出更复杂的问题 - …

java xml xslt streaming stx

4
推荐指数
1
解决办法
1981
查看次数

使用C++在字符串中定位STX和ETX

有没有办法在c ++中的recv()接收的消息中检测STX(文本开头)和ETX(文本结束)字符序列?我正在尝试修复TCP中可能发生的任何部分读取,以便我可以改写完整的消息.

谢谢!

EDIT1:

按照放松的答案做了以下事项:

char c = '\x02';
if(memchr((*it).c_str(), c, numberOfCharactersRead) != NULL) 
    cout << "STX found" << endl;
Run Code Online (Sandbox Code Playgroud)

我仍然没有设法检测到这个角色.这个实现有什么问题吗?'it'是字符串类型向量的迭代器.

EDIT2:

这是接收数据和检查角色的完整代码:

int numberOfCharactersRead = 0;

    do {
        char msgBuffer[1000];
        memset(msgBuffer, 0, 1000);
        numberOfCharactersRead = recv(clientSideSocket, msgBuffer, (1000 - 1), 0);
        if (numberOfCharactersRead < 0) {
            close(clientSideSocket);
        }
        else if (numberOfCharactersRead == 0)
            close(clientSideSocket);
        else {
            char c = '\x02';
            if(memchr(msgBuffer, c, numberOfCharactersRead) != NULL) 
                cout << "STX found" << endl;
            memset(msgBuffer, 0, 1000);
        }

    } while (numberOfCharactersRead > …
Run Code Online (Sandbox Code Playgroud)

c++ tcp stx recv

1
推荐指数
1
解决办法
8816
查看次数

标签 统计

stx ×3

xslt ×2

c++ ×1

java ×1

performance ×1

recv ×1

streaming ×1

tcp ×1

xalan ×1

xml ×1