Заменить атрибут в xml на xpath - PullRequest
5 голосов
/ 24 декабря 2010

Я хочу взять атрибут, найденный через xpath, и заменить его в документе.

Это xml:

<MineX STATE="add">
  <Desc F_CREATOR="admin" F_ENTRYDATE="2010-12-24" F_HEIGHT="0.875" F_ID="1" F_LEFT="1.15625" F_LINE_COLOR="255" F_FORECOLOR="0">
    <F_CUSTOM_BYTES></F_CUSTOM_BYTES>
  </Desc>
</MineX>

В Java я могу получить значение следующим образом:

org.w3c.dom.Document xmlDoc = getDoc(path);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

XPathExpression myExp = xpath.compile("//MineX/Desc/@F_LINE_COLOR");
System.out.println("Line color:" + (String)myExp.evaluate(xmlDoc, XPathConstants.STRING) + "\n");

Это распечатывает: 255

Итак, какая функция XPath позволит мне заменить 255 другой строкой?Или мне для этого нужно что-то кроме XPath?

Ответы [ 2 ]

5 голосов
/ 25 декабря 2010

Итак, какая функция XPath позволит мне заменить 255, на другой строка? Или мне нужно что-то другое чем XPath для этого?

XPath является языком запросов для XML и поэтому не может изменять XML-документ .

Для изменения XML-документа необходимо использовать язык программирования (например, XSLT, C #, JS, PHP, ... и т. Д.), На котором размещается XPath.

Вот решение, где языком хостинга является XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNewLineColor" select="123"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="@F_LINE_COLOR">
  <xsl:attribute name="{name()}">
    <xsl:value-of select="$pNewLineColor"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<MineX STATE="add">
    <Desc F_CREATOR="admin"
          F_ENTRYDATE="2010-12-24"
          F_HEIGHT="0.875"
          F_ID="1"
          F_LEFT="1.15625"
          F_LINE_COLOR="255"
          F_FORECOLOR="0">
        <F_CUSTOM_BYTES></F_CUSTOM_BYTES>
    </Desc>
</MineX>

желаемый, правильный результат выдается :

<MineX STATE="add">
    <Desc F_CREATOR="admin"
          F_ENTRYDATE="2010-12-24"
          F_HEIGHT="0.875"
          F_ID="1"
          F_LEFT="1.15625"
          F_LINE_COLOR="123"
          F_FORECOLOR="0">
        <F_CUSTOM_BYTES></F_CUSTOM_BYTES>
    </Desc>
</MineX>
0 голосов
/ 25 декабря 2010

XPath - это язык запросов для извлечения информации из файла XML.Насколько я знаю, он не подходит для замены или редактирования данных в XML.Одним из способов преобразования XML-данных является использование XSLT.

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