Есть ли способ написать XML так же, как мы читаем с использованием XPath? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть XML, как показано ниже, и я читаю XML с использованием XPath.Так как я знаю точное местоположение, где будут находиться данные, я динамически передаю путь к объекту Expression и получаю значения.

    <MESSAGE xmlns:xlink="http://www.w3.org/1999/xlink">
    <ABOUT_VERSIONS>
    <ABOUT_VERSION SequenceNumber="1"  xlink:label="ASSET_1" >
    <CreatedDatetime>2015-08-24T09:30:47Z</CreatedDatetime>
    <DataVersionName>Purchase Example</DataVersionName>
    </ABOUT_VERSION>
    </ABOUT_VERSIONS>
    <DEALS>
         <DEAL>
              <ACCOUNT>
                  <Name>Test</Name>
              </ACCOUNT>
         </DEAL>
    </DEALS>
    </MESSAGE>

Я использую код ниже для чтения XML.

XPathFactory xpf = XPathFactory.newInstance();            
XPath xPath = xpf.newXPath();
XPathExpression pathExpression = 
xPath.compile("MESSAGE/ABOUT_VERSIONS/ABOUT_VERSION");   
InputSource inputSource = new InputSource("C:/Sample.xml");  
NodeList Nodes = (NodeList) 
xPath.evaluate("MESSAGE/ABOUT_VERSIONS/ABOUT_VERSION", inputSource, 
XPathConstants.NODESET);

Существует ли такой способ написания XML на Java?Мне нужно написать тот же XML с дополнительными тегами и дополнительными данными позже.

1 Ответ

0 голосов
/ 20 октября 2018

XPath сам по себе является языком сопоставления с образцом, как и регулярные выражения, поэтому вы не можете использовать его напрямую для манипулирования.Но, как и в регулярных выражениях, существуют механизмы, позволяющие использовать XPath как часть большого технологического стека для изменения документов.

Если вы пытаетесь изменить существующий XML-документ, вам следует рассмотреть его как дерево DOM.Затем вы можете использовать XPath, чтобы легко находить отдельные узлы или группы узлов, которые вы хотите изменить.Измените их, используя модель DOM, а затем сериализовайте обратно на диск.

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

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

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

Я бы предложил больше деталей, но, честно говоря, я не работал с этим уже около 6 лет, так что я немного разбираюсь в синтаксисе.

...