barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)
Показаны сообщения с ярлыком dom. Показать все сообщения
Показаны сообщения с ярлыком dom. Показать все сообщения

среда, 7 августа 2013 г.

XMLBeans: "java.lang.RuntimeException: DOM Level 3 Not implemented" при использовании bean.getDomNode().getTextContent()

Имплементация DOM, используемая в XmlBeans, не поддерживает данный метод, поэтому приходится идти в обход, получая всех потомков узла и извлекая текст из них. Например:
        NodeList childNodes = element.getChildNodes();
        StringBuilder strBldr = new StringBuilder();
        for(int x=0; x<childNodes.getLength(); x++) {
            Node childNode = childNodes.item(x);
            if(childNode.getNodeType() == Node.TEXT_NODE) {
                strBldr.append(childNode.getNodeValue());
            }
        }
Спасибо http://stackoverflow.com/questions/12746038/why-do-i-get-a-dom-level-3-not-implemented-error-at-run-time.

понедельник, 10 сентября 2012 г.

Xalan: двойной CR в CDATA-секциях

Наткнулся на баг в библиотеке Xalan (являющейся в моем случае реализацией по-умолчанию javax.xml.transform.TransformerFactory): при сериализации в Windows XML-документа с CDATA-секциями переводы строки в этих секциях представляются последовательностями CR-CR-LF вместо CR-LF. В баг трекере апача соответствующая заявка лежит уже давным-давно без ответа: https://issues.apache.org/jira/browse/XALANJ-2547. Выход - например, заменять вручную в полученной строке "\r\r\n" на "\r\n":

public static String domToString(Document dom) throws TransformerException
{
Source source = new DOMSource(dom);
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(source, result);
return stringWriter.getBuffer().toString().replace("\r\r\n", "\r\n");

вторник, 20 декабря 2011 г.

JavaScript: получение индекса элемента среди его соседей с тем же именем тега

Задача:
Получить индекс (начиная от 0) элемента среди его соседей (непосредственных детей его родителя) с тем же именем тега, что и у него самого (на чистом JS, без использования библиотек).

Решение:
Не нашел другого решения, кроме как сделать это перебором потомков:
function getElementIndexWithinSameTagged(elem)
{
    var children = elem.parentNode.getElementsByTagName(elem.tagName);
    for(var i=0;i<children.length;i++)
        if(elem == children.item(i))
            return i;
    return -1; // never will get here
}

пятница, 9 декабря 2011 г.

JavaScript: Как установить текст внутри узла DOM, не являющегося текстовым

Задача:
Задать текст внутри узла типа ELEMENT_NODE (т.е. обычного узла DOM-дерева). Пусть узел содержится в переменной element, а текст - в переменной txt (и element.nodeType равен 1 или, в Firefox, константе element.ELEMENT_NODE).
Решение:
Создать дочерний узел типа 3 (TEXT_NODE) с заданным текстом:
var txtNode = document.createTextNode(txt);
element.appendChild(txt);
В принципе, можно было воспользоваться и не стандартизированным свойством element.innerHtml , но приведенный выше способ корректнее с точки зрения стандарта.