Текущая версия Openlayers 5.x.x нуждается в некоторых обновлениях печати . Поскольку даже вы используете Openlayers 5.x.x, установленные типы относятся к версии 4.x.x.
Это означает, что вам нужен обходной путь в вашем коде.
Поскольку все наборы в версии 4.xx используют метод DefaultExports , вы не можете использовать NamedExports , например:
import {pointerMove} from 'ol/events/condition';
[1112 ] Решение:
Один из вариантов, который вы можете сделать, - импортировать все как переменную . При этом вы избежите ошибки TS:
import Select from 'ol/interaction/select';
import * as condition from 'ol/events/condition';
this.selectPointerMove = new Select({
condition: (condition as any).pointerMove
});
this.coreMapComponent.map.addInteraction(this.selectPointerMove);
Одним из побочных эффектов этого является то, что вы удалите опцию, чтобы сделать шейкер дерева , но хорошо, вы выживете без что.
Надеюсь, это поможет!
Я бы распечатал также результат an2.getNodeName ()
для целей отладки , Я предполагаю, что ваш код сканирования дерева не сканирует те узлы, которые, как вы думаете, есть. Это подозрение усиливается отсутствием проверки имен узлов в вашем коде.
Кроме этого, javadoc для Node определяет " getNodeValue ()", чтобы возвратить ноль для узлов типа Element. Следовательно, вы действительно должны использовать getTextContent (). Я не уверен, почему это не даст вам текст, который вы хотите.
Возможно, выполните итерации дочерних элементов вашего узла тега и посмотрите, какие типы есть?
Пробовал этот код, и он работает для меня:
String xml = "<add job=\"351\">\n" +
" <tag>foobar</tag>\n" +
" <tag>foobar2</tag>\n" +
"</add>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes());
Document doc = db.parse(bis);
Node n = doc.getFirstChild();
NodeList nl = n.getChildNodes();
Node an,an2;
for (int i=0; i < nl.getLength(); i++) {
an = nl.item(i);
if(an.getNodeType()==Node.ELEMENT_NODE) {
NodeList nl2 = an.getChildNodes();
for(int i2=0; i2<nl2.getLength(); i2++) {
an2 = nl2.item(i2);
// DEBUG PRINTS
System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):");
if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent());
if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue());
System.out.println(an2.getTextContent());
System.out.println(an2.getNodeValue());
}
}
}
Вывод был:
#text: type (3): foobar foobar
#text: type (3): foobar2 foobar2
Если ваш XML идет достаточно глубоко, вы можете рассмотреть возможность использования XPath, который поставляется с вашей JRE, так что вы можете получить гораздо более легкий доступ к содержимому, используя:
String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()",
document.getDocumentElement());
Полный пример:
import static org.junit.Assert.assertEquals;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
public class XPathTest {
private Document document;
@Before
public void setup() throws Exception {
String xml = "<add job=\"351\"><tag>foobar</tag><tag>foobar2</tag></add>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
document = db.parse(new InputSource(new StringReader(xml)));
}
@Test
public void testXPath() throws Exception {
XPathFactory xpf = XPathFactory.newInstance();
XPath xp = xpf.newXPath();
String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()",
document.getDocumentElement());
assertEquals("foobar", text);
}
}