天道酬勤,学无止境

动态替换 XML DML 中节点的值(Dynamically replacing the value of a node in XML DML)

问题

我现在正在为此苦苦挣扎:如何替换文本等于某个变量值的无类型 XML 列中节点的值? 是否有可能?

我的 XML:

<attrs>
  <attr>ManualInsert</attr>
  <attr>ManualInsert2</attr>
  <attr>ManualInsert4</attr>
  <attr>ManualInsert8</attr>
</attrs>

我的尝试:

DECLARE @OldValue Varchar(255) =  'ManualInsert'
DECLARE @NewValue Varchar(255) =  'ReplacedValue'

UPDATE
    Labels
SET
    Attributes.modify('replace value of (/attrs/attr/text())[1]
                       with
                       if ((/attrs/attr/text() = sql:variable("@OldValue")))
                       then sql:variable("@NewValue")
                       else () ')
WHERE
    Id = 2000046

消息: (0 row(s) affected)

DECLARE @OldValue Varchar(255) =  'ManualInsert'
DECLARE @NewValue Varchar(255) =  'ReplacedValue'

UPDATE
    Labels
SET
    Attributes.modify('replace value of (/attrs/attr[text() = sql:variable("@OldValue")])[1]
                       with sql:variable("@NewValue")')
WHERE
    Id = 2000046

信息:

Msg 2356, Level 16, State 1, Line 7
XQuery [Labels.Attributes.modify()]: The target of 'replace value of' must be a non-metadata attribute or an element with simple typed content, found 'element(attr,xdt:untyped) ?'

预期结果:

<attrs>
  <attr>ReplacedValue</attr>
  <attr>ManualInsert2</attr>
  <attr>ManualInsert4</attr>
  <attr>ManualInsert8</attr>
</attrs>
回答1
modify('replace value of (/attrs/attr[. = sql:variable("@OldValue")]/text())[1]
        with sql:variable("@NewValue")')

您的第二次尝试实际上只是缺少指定应该替换的是 text() 。 这也将起作用。

modify('replace value of (/attrs/attr[text() = sql:variable("@OldValue")]/text())[1]
        with sql:variable("@NewValue")')

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java动态修改未知JSON的JsonNode(Modify JsonNode of unknown JSON dynamically in Java)
    问题 我正在尝试修改一个 JSON(结构未知),其中 JsonPath 及其等效的 XML Xpath 是我已知的。 我已经厌倦了使用com.jayway.jsonpath.JsonPath库。 JsonPath 的问题是,它返回值但我无法修改目标节点。 以下是我的代码片段 JsonPath.read(jsonFile, jsonPath); JsonPath.parse(jsonPath); System.out.println("Author: "+JsonPath.read(jsonFile, jsonPath)); 我尝试使用之前问过的问题中提到的杰克逊,但它需要按如下方式逐个节点遍历 ((ObjectNode) parent).put(fieldName, newValue); 由于未知的结构,我无法做到这一点。 我已经尝试了递归解析 JSON 对象问题的答案,但它说明了如何解析而不是修改 我需要做以下事情 JsonNode root = mapper.readTree("Json in form of String"); ((JsonNode)(root.get("JsonPath")).set("New Value"); 有什么方法可以实现吗? 回答1 JsonNode对象是不可变的,因此您无法修改它们。 你可以做的是用另一个替换一个JsonNode 。
  • Dynamically replacing the value of a node in XML DML
    I am struggling with this now: How do you replace the value of a node in an untyped XML column where the text is equal to a certain variable value? Is it possible? My XML: <attrs> <attr>ManualInsert</attr> <attr>ManualInsert2</attr> <attr>ManualInsert4</attr> <attr>ManualInsert8</attr> </attrs> My Tries: DECLARE @OldValue Varchar(255) = 'ManualInsert' DECLARE @NewValue Varchar(255) = 'ReplacedValue' UPDATE Labels SET Attributes.modify('replace value of (/attrs/attr/text())[1] with if ((/attrs/attr/text() = sql:variable("@OldValue"))) then sql:variable("@NewValue") else () ') WHERE Id = 2000046
  • 如何动态加载单独的“应用程序设置”文件并与当前设置合并?(How to load a separate Application Settings file dynamically and merge with current settings?)
    问题 有一些问题与从单独的配置文件中读取设置有关,还有其他与之类似,但是我的问题是特定于应用程序属性设置(即<MyApplication.Properties.Settings> -参见下面的XML文件)以及如何动态加载它们的。 我尝试了本文中的方法,该方法涉及刷新主配置文件的整个appSettings部分,但是由于我没有替换appSettings部分,因此我的修改抛出了异常: var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); // Have tried the other ConfigurationUserLevels to no avail config.AppSettings.File = myRuntimeConfigFilePath; config.Save(ConfigurationSaveMode.Modified); // throws ConfigurationErrorsException ConfigurationManager.RefreshSection("userSettings"); ConfigurationErrorsException.Message为“根元素必须与引用文件
  • 如何使用PHP动态生成XML文件?(How to generate XML file dynamically using PHP?)
    问题 我必须在运行时动态生成一个xml文件。 请帮助我使用PHP动态生成以下XML文件。 <?xml version="1.0" encoding="UTF-8"?> <xml> <track> <path>song1.mp3</path> <title>Track 1 - Track Title</title> </track> <track> <path>song2.mp3</path> <title>Track 2 - Track Title</title> </track> <track> <path>song3.mp3</path> <title>Track 3 - Track Title</title> </track> <track> <path>song4.mp3</path> <title>Track 4 - Track Title</title> </track> <track> <path>song5.mp3</path> <title>Track 5 - Track Title</title> </track> <track> <path>song6.mp3</path> <title>Track 6 - Track Title</title> </track> <track> <path>song7.mp3</path> <title>Track 7 -
  • 用m子中的其他值替换xml特定节点元素的值(replace xml particular node element value with other value in mule)
    问题 <healthcare> <plans> <plan1> <planid>100</planid> <planname>medical</planname> <desc>medical</desc> <offerprice>500</offerprice> <area>texas</area> </plan1> <plan2> <planid>101</planid> <planname>dental</planname> <desc>dental</desc> <offerprice>1000</offerprice> <area>texas</area> </plan2> </plans> </healthcare> <splitter evaluator="xpath" expression="/healthcare/plans" doc:name="Splitter"/> <transformer ref="domToXml" doc:name="Transformer Reference"/> <logger level="INFO" doc:name="Logger" message=" plans detils...#[message.payload]" /> 我想在运行时用其他值替换 offerprice 值。感谢任何帮助。我尝试了各种不同的方法。
  • Mybatis原理--动态生成SQL
    本文将带你分析Mybatis是如何动态生成SQL。 首先,会根据源码分析框架初始化时xml文件的加载、解析、缓存过程。着重介绍 xml的解析过程 和 使用解析的结果,最后列举实例和对照源码DeBug分析:当DAO接口调用时标签的解析、参数的创建、SQL的生成过程,并总结整个流程。 数据的处理 Mybatis对数据的处理可以分为 用入参动态的拼装sql 和 对sql执行的结果封装成 JavaBean 这里包括两个过程:1. 查询阶段我们要将java类型的数据,转换成jdbc类型的数据,通过 preparedStatement.setXXX() 来设值 2. 另一个就是对resultset查询结果集的jdbcType 数据转换成java 数据类型,本文只介绍第一个过程。 根据传入的参数动态的拼装sql 在Mybatis中,需要根据xml标签的语法编写出动态SQL,在执行的时候会根据标签进行解析,这里使用的是 Ognl 来解析标签动态地构造SQL语句 分析parseDynamicTags 的解析过程: Spring与Mybatis整合的时候需要配置SqlSessionFactoryBean,该配置会加入数据源和Mybatis xml配置文件路径等信息 <bean id="sqlSessionFactory" class="org.mybatis.spring
  • 二叉查找树及其C语言实现详解
    目录 一、树(Tree) 二、二叉树 1、概念 2、二叉树的存储方式 3、二叉树的遍历 三、二叉查找树 1、查找操作 2、插入操作 3、删除操作 4、修改操作 5、节点清空和树销毁操作 四、支持重复数据的二叉查找树 1、每个节点存储多个对象数据 2、每个节点存储单个对象数据 五、二叉查找树C语言实现 1、数据结构 2、操作函数声明 3、具体实现 4、调试问题 六、说明 一、树(Tree) 树是一种一种非线性表结构。如下图,A 节点就是 B 节点的父节点,B 节点是 A 节点的子节点。B、C、D 这三个节点的父节点是同一个节点,所以它们之间互称为兄弟节点。我们把没有父节点的节点叫作根节点,也就是图中的节点 E。我们把没有子节点的节点叫作叶子节点或者叶节点,比如图中的 G、H、I、J、K、L 都是叶子节点 节点的高度(Height):节点到叶子节点的最长路径(边数),从下往上节点深度(Depth):根节点到这个节点的的最长路径(边数),从上往下节点的层(Level)数:节点的深度+1 数的高度:根节点的高度 二、二叉树 1、概念 每个节点最多只有2个子节点的树,这两个子节点分别为左子节点和右子节点。 满二叉树:叶子节点全部在最底层,除了叶子节点外,每个节点都有左右两个子节点 完全二叉树:叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大
  • 在SQL Server中更新空XML标记(Update Empty XML Tag in SQL Server)
    问题 我正在尝试在sql服务器上的Xml字符串中更新一个空的XML标记; 它说当我运行以下脚本时该行已更新,但是当我查看XML时; 什么也没有变: Declare @newValue varchar(100) select @newValue = '01' update dbo.UploadReport set XmlTest.insert('replace value of (/CodeFiveReport/Owner/AgencyID/text())[1] with sql:variable("@newValue")') where id = 'myId' 之后的xml仍以这种方式出现在数据库中 <AgencyID /> 我究竟做错了什么? 我已经尝试了@AgencyID,但最后没有text()仍然没有用... 回答1 据我自己的经验,您不能一步一步地完成此操作,因为<AgencyID/>元素实际上没有text() -因此,您无法替换它。 您可能需要使用类似以下的内容: DECLARE @newValue VARCHAR(100) SELECT @newValue = '01' -- first update - add a new <AgencyID>...</AgencyID> node UPDATE dbo.UploadReport SET XmlTest.modify(
  • 如何在Xslt中用另一个替换节点名?(How to replace a node-name with another in Xslt?)
    问题 关于这个问题的措辞不好,对此表示遗憾。 将尝试解释我要做什么。 基本上,我的搜索结果为Xml,在Xml中有一个像这样的节点: <FIELD NAME="body"> Somebody named <key>Doris</key> and <key>Arnie</key> </FIELD> 简而言之,我需要将“ <key>”替换为“ <strong>”; IE。 突出显示搜索结果(关键节点值是用户搜索的值)。 在Xslt中,除了查询Xml-> FIELD [@ name ='body'] / key外,我不知道用户从中搜索了什么。 现在,我有一些疯狂的代码可以提取搜索词(“ Doris”)前面的所有内容,但是ony只能用于1个搜索词。 我们需要它才能多次执行此操作。 我们使用的代码如下所示: <xsl:template name="highlighter"> <xsl:param name="text"/> <xsl:param name="what"/> <xsl:choose> <xsl:when test="contains($text, $what) and string-length($what) > 0"> <xsl:variable name="before" select="substring-before($text, $what)"/> <xsl
  • 一次更新sql server xml数据字段上的多个属性(Update multiple attributes on sql server xml data field at once)
    问题 是否可以在一次更新中修改单个节点上的多个属性? 我有类似的东西: <ENTITY NAME="entity1"> <ATTR ID="attr1" CAPTION="Attributes to Change" SIZE="100" WIDTH="100"></ATTR> </ENTITY> 我已经能够使用三个单独的更新来修改 CAPTION、SIZE 和 WIDTH 属性,但是我一直在寻找将它们组合成单个更新的方法,但徒劳无功。 是否有可能? 我使用的更新示例: UPDATE t SET [column_name].modify('replace value of (/ENTITY/ATTR/@CAPTION)[1] with "New Attribute Caption"') FROM table t UPDATE t SET [column_name].modify('replace value of (/ENTITY/ATTR/@SIZE)[1] with "200"') FROM table t UPDATE t SET [column_name].modify('replace value of (/ENTITY/ATTR/@WIDTH)[1] with "200"') FROM table t 回答1 不,这是不可能的。 来自 (XML DML) 的替换值。
  • 替换XML文件中的动态内容(Replace dynamic content in XML file)
    问题 快速摘要:我需要创建一个Bash脚本,以每周自动更改节点中的文本。 该脚本将匹配节点并替换其中的文本(如果可能的话)? 我该怎么做? 详细信息:我托管了一个Minecraft服务器,该服务器上有商店,每个商店在/ ShowcaseStandalone / ffs-storage /目录中都有自己的.xml文件。 每个星期天,我的服务器都会重新启动,并在终端中执行一些命令以重置一些内容。 我要改变的一件事是商店之一。 我想更改节点<itemstack>中的文本和节点<price>中的文本。 我只是想从另一个文件夹中的.txt文件中提取文本,然后将其插入该节点中。 问题在于,节点中的文本每周都会更改。 有什么方法可以使用bash替换两个节点内的特定行或文本吗? XML档案: <?xml version="1.0" encoding="UTF-8"?> <scs-shop usid="cac8480951254352116d5255e795006252d404d9" version="2" type="storage"> <enchantments type="string"/> <owner type="string">Chadward27</owner> <world type="string">Frisnuk</world> <itemStack type="string"
  • (xslt 1.0)如何用xml中所有文本值中的某些字符串替换空格?((xslt 1.0) How to replace the space with some string from all the text values in xml?)
    问题 编辑: [它从字符替换开始,最后我在Dimitre Novatchev和Roland Bouman的帮助下发现了字符串替换 我认为示例代码足以解释要求。 这是示例XML: <root> <node1>text node</node1> <node2>space between the text</node2> <node3> has to be replaced with $</node3> </root> 这是我期望的输出: <root> <node1>text$node</node1> <node2>space$between$the$text</node2> <node3>$has$to$be$replaced$with$$</node3> </root> 我尝试编写XSLT代码,但未显示所需的输出.. 这是代码: <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="text()[.!='']"> <xsl:call-template name="rep_space"> <xsl:with-param name="text" select="."/
  • Prometheus中动态发现Target和Relabel的应用
    郑云龙 分布式实验室本文以Consul为例介绍了Prometheus的服务发现能力,适用于在云平台/容器平台的监控场景动态发现Target。同时通过Prometheus的relabel实现多数据中心的监控数据聚合,以及选择和过滤监控Target。Prometheus中的Job和InstancePrometheus主要由一下几个部分组成:Prometheus Server:负责采集监控数据,并且对外提供PromQL实现监控数据的查询以及聚合分析;Exporters:用于向Prometheus Server暴露数据采集的endpoint,Prometheus轮训这些Exporter采集并且保存数据;AlertManager以及其它组件(……和本文无关就不说这些)在Prometheus Server的配置文件中我们使用scrape_configs来定义:其中每一个scrape_config对象对应一个数据采集的Job,每一个Job可以对应多个Instance,即配置文件中的targets。通过Prometheus UI可以更直观的看到其中的关系。Pull vs Push对于Zabbix以及Nagios这类Push系统而言,通常由采集的Agent来决定和哪一个监控服务进行通讯。而对于Prometheus这类基于Pull的监控平台而言,则由server侧决定采集的目标有哪些。相比于Push
  • XPATH查询中的特殊字符(Special Character in XPATH Query)
    问题 我使用以下XPATH Query来列出站点下的对象。 ListObject[@Title='SomeValue'] 。 SomeValue是动态的。 只要SomeValue没有撇号('),此查询就起作用。 也尝试使用转义序列。 没用 我究竟做错了什么? 回答1 令人惊讶地,这很难做到。 看一看XPath Recommendation,您会看到它将文字定义为: Literal ::= '"' [^"]* '"' | "'" [^']* "'" 也就是说,XPath表达式中的字符串文字可以包含撇号或双引号,但不能同时包含两者。 您不能使用转义来解决此问题。 像这样的文字: 'Some&apos;Value' 将匹配以下XML文本: Some&apos;Value 这确实意味着,可能有一部分XML文本无法生成匹配的XPath文字,例如: <elm att=""&apos"/> 但这并不意味着不可能将文本与XPath匹配,这很棘手。 在任何情况下,如果您要匹配的值都包含单引号和双引号,则可以构造一个使用concat生成将要匹配的文本的表达式: elm[@att=concat('"', "'")] 因此,这导致了这一点,这比我希望的要复杂得多: /// <summary> /// Produce an XPath literal equal to the value if
  • 通过 xsl 动态更改 HTML(Change HTML dynamically thru xsl)
    问题 我有以下 html: <!DOCTYPE html> <html> <head> <style> table, th, td { border: 1px solid black; border-collapse: collapse; } th, td { padding: 5px; } </style> </head> <body> <table style="width:100%"> <tr> <th>Name</th> <th>City</th> <th>State</th> <th>Zip</th> </tr> <tr> <td> [lastName],[firstName] </td> <td>[City]</td> <td>[State]</td> <td>[Zip]</td> </tr> </table> </body> </html> 我将从 xml 中获取值 <person> <lastName>Zones</lastName> <firstName>Adam</firstName> <City>Columbus</City> <State>OH</State> <Zip>44250</Zip> </person> 我想动态地将表数据<td>元素中的值替换为: <td>Zones, Adam</td> <td>columbus</td> <td>OH</td>
  • JavaScript学习记录
    JavaScript初识 JavaScript是Web页面中的一种脚本编程语言,也是一种通用的、跨平台的、基于对象和事件驱动并具有安全性的脚本语言。它不需要进行编译,而是直接嵌入在HTML页面中,把静态页面转变成支持用户交互并响应相应事件的动态页面。 引入(script) 内部引入 在HTML文档中可以使用 <script>... </script>标记将JavaScript脚本嵌入到其中。 ​script属性: script属性说明language不常用type用于指定使用的脚本类型src指定外部脚本文件路径defer不常用 type属性的语法格式: <script type = "text/javascript"> ··· </script> 外部引入 多了个src属性 URL 或 本地路径 <script type = "text/javascript" src = "js文件的rul路径"> ··· </script> 注意: 外部JavaScript文件中只能包含JavaScript代码,不能包含HTML和<script>标签。在<script>标签内部不要存在其他的JavaScript代码。在链接外部JavaScript文件时</script>结束标签不能省略。 标签属性值引用 在HTML文档中可以在<a>标签、<input>标签
  • HashMap实现原理以及源码解析jdk1.8(3)--put与扩容
    HashMap实现原理以及源码解析jdk1.8--put与扩容 1、put源码: 先执行put方法 /** * Associates the specified value with the specified key in this map. * If the map previously contained a mapping for the key, the old * value is replaced. * * @param key key with which the specified value is to be associated * @param value value to be associated with the specified key * @return the previous value associated with <tt>key</tt>, or <tt>null</tt> if there was no * mapping for <tt>key</tt>. (A <tt>null</tt> return can also indicate that the map previously * associated <tt>null</tt> with <tt>key</tt>.) */ /** *
  • 使用 Open Xml 替换 Word 文档中的文本(Replace Text in Word document using Open Xml)
    问题 我已经从 word 模板创建了一个 docx 文件,现在我正在访问复制的 docx 文件并想用其他一些数据替换某些文本。 我无法获得有关如何从 doument 主要部分访问文本的提示? 任何帮助将是可观的。 下面是我到现在为止的代码。 private void CreateSampleWordDocument() { //string sourceFile = Path.Combine("D:\\GeneralLetter.dot"); //string destinationFile = Path.Combine("D:\\New.doc"); string sourceFile = Path.Combine("D:\\GeneralWelcomeLetter.docx"); string destinationFile = Path.Combine("D:\\New.docx"); try { // Create a copy of the template file and open the copy File.Copy(sourceFile, destinationFile, true); using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true
  • 如何使用和替换 &mut ref 中的值 [重复](How to consume and replace a value in an &mut ref [duplicate])
    问题 这个问题在这里已经有了答案: 如何在对结构的可变引用中为字段交换新值? (2 个回答) 3年前关闭。 有时我会遇到一个问题,由于实现细节应该对用户不可见,我需要“销毁”一个&mut并在内存中替换它。 这通常最终发生在递归方法或递归结构的 IntoIterator 实现中。 它通常遵循以下形式: fn create_something(self); pub fn do_something(&mut self) { // What you want to do *self = self.create_something(); } 我在当前项目中碰巧遇到的一个例子是在我编写的 KD 树中,当我“删除”一个节点时,我没有做逻辑来重新排列孩子,而是解构我需要删除和重建的节点从其子树中的值: // Some recursive checks to identify is this is our node above this if let Node{point, left, right} = mem::replace(self, Sentinel) { let points = left.into_iter().chain(right.into_iter()).collect(); (*self) = KDNode::new(points); Some(point) } else {
  • 如何使用json.NET反序列化动态命名的根节点(How to deserialize a dynamically named root node with json.NET)
    问题 这是json文件的示例: { "John Smith": { "id": "72389", "email": "johnsmith@gmail.com", "books": [ { "id": "0", "title": "The Hunger Games", "rating": "5" }, { "id": "1", "title": "Harry Potter and the Order of the Phoenix", "rating": "3" }, ], "magazines": [ { "id": "2", "title": "National Geographic", "rating": "1" }, { "id": "3", "title": "Wired", "rating": "4" } ], } } 注意,根节点有一个动态名称(John Smith),而我需要反序列化的每个json都有一个不同的名称。 此json结构将需要具有如下所示的类设置: public class RootObject { public JohnSmith { get; set; } } public class JohnSmith //oops { public string id { get; set; } public string email { get; set; }