обработка возврата каретки при канонизации с помощью java

Я пытаюсь канонизировать текстовый узел html по классу com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java. В моем входном файле есть возврат каретки и перевод строки в конце. После канонизации я ожидаю, что возврат каретки будет преобразован в 
. Однако вывод, который я получаю, не содержит возврата каретки. Он содержит только перевод строки. Как мне изменить свой код, чтобы включить возврат каретки?

пример: мой ввод с cr и lf в конце

<MyNode xmlns="http://www.artsince.com/test#">Lqc3EeJlyY45bBm1lha869dkHWw1w+U8A6aKM2Xuwk3yWTjt0A2Wq/25rAncSBQlBGOCyTmhfic9(crlf)
9mWf4mC2Ui6ccLqCMjFR4mDQApkfoTy+Cu2eHul9CRjKa0TqckFv7ryda9V5MHruueXII/V+gPLT(crlf)
c76LsetK8C1434K66+Q=</MyNode>

это пример кода, который я использую

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream(new File("C:\\text.xml")));

if(!Init.isInitialized())
{
   Init.init();
}

Path xPath = XPathFactory.newInstance().newXPath();
String expression = "child::*/child::text()"; 
NodeList textNodeList = (NodeList) xPath.evaluate(expression, doc, XPathConstants.NODESET);
Canonicalizer cn = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
byte[] canonn = cn.canonicalizeXPathNodeSet(textNodeList);
System.out.println(new String(canonn).toCharArray());

и результат, который я получаю, имеет только lf в конце

Lqc3EeJlyY45bBm1lha869dkHWw1w+U8A6aKM2Xuwk3yWTjt0A2Wq/25rAncSBQlBGOCyTmhfic9(lf)
9mWf4mC2Ui6ccLqCMjFR4mDQApkfoTy+Cu2eHul9CRjKa0TqckFv7ryda9V5MHruueXII/V+gPLT(lf)
c76LsetK8C1434K66+Q=

однако я ожидаю увидеть &#xD; и lf в конце строк

Lqc3EeJlyY45bBm1lha869dkHWw1w+U8A6aKM2Xuwk3yWTjt0A2Wq/25rAncSBQlBGOCyTmhfic9&#xD;(lf)
9mWf4mC2Ui6ccLqCMjFR4mDQApkfoTy+Cu2eHul9CRjKa0TqckFv7ryda9V5MHruueXII/V+gPLT&#xD;(lf)
c76LsetK8C1434K66+Q=

person artsince    schedule 10.08.2010    source источник


Ответы (1)


XML определяет, что ввод может содержать все возможные типы стилей EOL, но синтаксический анализатор должен заменить их все одним символом перевода строки (\n, ASCII 10).

Если вы хотите защитить символ, вы должны сами заменить ASCII 13 на &#13;, прежде чем синтаксический анализатор XML увидит ввод. Если вы используете Java, я предлагаю использовать файл FilterInputStream.

person Aaron Digulla    schedule 10.08.2010
comment
значит ли это, что в данном случае неправильно ожидать замены cr на канонизацию? - person artsince; 10.08.2010
comment
Не только в этом случае; XML всегда проглатывает его еще до создания текстовых узлов. - person Aaron Digulla; 10.08.2010
comment
Я боюсь, что ранее я ошибся с искусством, поскольку c14n предназначен для сохранения явного, но нормализации символов U + 000D, поскольку это сделало трудность с эквивалентным кодом .NET казавшейся мне правильной, когда это не так. В .NET желательно выполнить нормализацию перед загрузкой XmlDocument, чтобы сохранить правильные случаи, иначе их нельзя будет отличить от явных случаев. Это легко сделать, но тот факт, что это часто верно в выводе c14n, ввел меня в заблуждение. - person Jon Hanna; 10.08.2010