【发布时间】:2011-05-13 21:52:47
【问题描述】:
我正在做一个 biztalk 项目,我需要将(过滤的)内容从 1 个 xml 复制到另一个。 我必须用 xpath 来做这个,我不能使用 xsl 转换。 所以我从源xml文件中获取内容的xpath是这样的:
//*[not(ancestor-or-self::IN1_Insurance)]|//IN1_Insurance[2]/descendant-or-self::*
现在返回一个 xmlNodelist。是否可以返回一个包含所有节点的字符串,例如:
"<root><node>text</node></root>"
如果我将 string() 放在我的 xpath 之前,它会返回值,但我希望将整个 xml 放在一个字符串中(带有节点..),所以我可以将该字符串加载到另一个 xmldocument 中。我认为这是解决我的问题的最佳方法。
我知道我可以遍历 xmlnodelist 并将节点附加到新的 xmldocument,但是在 biztalk 编排中循环有点棘手,我想避免这种情况。
我可以使用的代码是 C#。 我试图将节点列表分配给 xmldocument,但这会引发转换错误(很明显..)。
我看到它的方式是我有 2 个解决方案:
- 在没有循环的情况下将节点列表分配给 xmldocument(我认为在 C# 中不可能)
- 以某种方式将节点列表转换为字符串并将其加载到 xmldocument 中
- 直接在新的xmldocument中加载xpath(不知道这是否可行,因为它返回一个节点列表)
感谢您的帮助
编辑:
样本输入:
<root>
<Patient>
<PatientId></PatientId>
<name></name>
</Patient>
<insurance>
<id>1</id>
<billing></billing>
</insurance
<insurance>
<id>2</id>
<billing></billing>
</insurance>
<insurance>
<id>3</id>
<billing></billing>
</insurance>
</root>
现在我想将此示例复制到另一个 xmldocument,但没有保险节点 2 和 3(这是动态的,因此可能要删除不保险节点 1 和 2,或者 1 和 3...)
所以这必须是输出:
<root>
<Patient>
<PatientId></PatientId>
<name></name>
</Patient>
<insurance>
<id>1</id>
<billing></billing>
</insurance>
</root>
我现在正在做的是使用 xpath 来获取我想要的节点。然后我想将结果分配给新的 xmldocument,但这是不可能的,因为我得到了 castException
string xpath = "//*[not(ancestor-or-self::IN1_Insurance)]|//IN1_Insurance[2]/descendant-or-self::*";
xmlDoc = new System.Xml.XmlDocument();
xmlDoc = xpath(sourceXml, strXpath); <= cast error (cannot cast xmlnodelist to xmldocuemnt)
我知道语法有点奇怪,但它是 biztalk c# 代码..
【问题讨论】:
-
@Dimitre,看起来您删除了 XPath 标记,这是可以理解的,但我不相信这里不存在 XPath 的问题。 OP 使用的 XPath 表达式很有可能是错误的。
-
@LarsH:我编辑了标签,因为 OP 想要的显然不能单独使用 XPath 实现——或者你建议把它放在“not-xpath”下吗?顺便说一句,你检查过你的电子邮件吗?
-
@Dimitre:我认为 xpath 标签适合有两个原因:1)问题“这可以使用 XPath 完成吗?”是一个关于 XPath 的有用问题,即使答案是“否”; 2)即使这个任务不能单独用 XPath 完成(不多),它可以用 XPath 结合环境中的其他工具来完成,在这种情况下,有必要让 XPath 表达式正确。 (是的,我会尽快回复电子邮件。:-)