Избегайте знаков '<' и '>' при использовании XPath в Java - PullRequest
0 голосов
/ 10 июля 2020

Я использую Java XPath API для изменения и работы с XML узлами. Чтение документа с помощью DocumentBuilder и обратная запись в документ с помощью Transformer API.

try {
            DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
            DocumentBuilder b = f.newDocumentBuilder();
            String pathToFile = ReadConfigFile.readPathToSampleFactsFile();
            
            Document doc = b.parse(new File(pathToFile));   
            XPath xPath = XPathFactory.newInstance().newXPath();
            Node maxSubjects = (Node) xPath.compile("//*[contains(@name, 'max_subjects')]").evaluate(doc, XPathConstants.NODE);
            maxSubjects.setTextContent("<xml>");       

            Transformer tf = TransformerFactory.newInstance().newTransformer();
            tf.setOutputProperty(OutputKeys.INDENT, "yes");
            tf.setOutputProperty(OutputKeys.METHOD, "xml");
            tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
                    

            DOMSource domSource = new DOMSource(doc);
            String fileName = BuildXML.buildXMLFileName(simPar)+".facts";
            StreamResult sr = new StreamResult(new File(fileName));
            tf.transform(domSource, sr);
}

Я хотел бы установить текстовое содержимое узла с некоторым тегом XML. Я использовал здесь пример для узла maxSubjects . Я не могу успешно экранировать символы «меньше» и «больше».

Я пробовал экранировать символ «меньше» с помощью <и в представлении Unicode. Однако он неправильно представлен в сгенерированном XML. <em><будет представлен как <в сгенерированном XML</em>

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Я хотел бы установить текстовое содержимое узла с каким-то тегом XML

Там есть некоторая путаница. Узел может содержать дочерние узлы, и он может иметь текстовое содержимое, но текстовое содержимое является строкой. Такие символы в строке, как «<», являются обычными символами, а не разметкой. Вы можете либо добавить дочерние узлы, либо установить текстовое содержимое, но вы не можете предоставить лексический XML в качестве текстового содержимого и ожидать, что он будет волшебным образом преобразован в дерево узлов. </p>

0 голосов
/ 10 июля 2020

Так вы не можете делать то, что хотите. Это обычная проблема, когда учишься думать при написании XSLT.

Вы видите, как буквальные < и > в тексте должны быть закодированы, чтобы гарантировать, что при синтаксическом анализе они передаются правильно как два

Поскольку вы запускаете XSLT-преобразование внутри своей Java программы, вам нужно просто написать свой XSLT, чтобы шаблон соответствовал текстовому узлу, а затем замените его первой частью текста, за которой следует нужные вам теги XML, а затем оставшийся текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...