Я работаю над проектом biztalk, и мне нужно скопировать (отфильтровать) содержимое от 1 xml к другому. Я должен сделать это с помощью xpath, я не могу использовать преобразование xsl. Так что мой XPath, чтобы получить содержимое из исходного файла XML заключается в следующем:xpath возвращает строку вместо nodelist
//*[not(ancestor-or-self::IN1_Insurance)]|//IN1_Insurance[2]/descendant-or-self::*
Теперь это возвращает XmlNodeList. Можно ли вернуть строку со всеми узлами в нем нравится:
"<root><node>text</node></root>"
Если я ставлю строку() перед моей XPath возвращает значения, но я хочу, чтобы весь XML в строке (с узлами ..), поэтому я мог загрузить эту строку в другой xmldocument. Я думаю, что это лучший метод для моей проблемы.
Я знаю, что могу перебирать xmlnodelist и добавлять узлы к новому xmldocument, но немного сложно петли в оркестровке biztalk, и я хочу этого избежать.
Код, который я могу использовать, это C#. Я попытался просто назначить нодлист в xmldocument, но это вызывает ошибку приведения (очевидно ..).
Как я вижу это, что у меня есть 2 решения:
- присваивают нодлист к XmlDocument без петли (не возможно я думаю, что в C#)
- каким-то образом преобразовать нодлист в строку и нагрузки это в XmlDocument
- ТЕПЛОВОЙ нАГРУЗКИ непосредственно в XPath новой XmlDocument (не знаю, если это возможно, поскольку он возвращает нодлист)
Спасибо за вашу помощь
редактировать:
ввода пробы:
<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 (это динамически, поэтому он может быть unsurance узел 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. Есть хороший шанс, что выражение XPath, используемое OP, неверно. – LarsH 2010-11-22 15:35:29
@LarsH: Я отредактировал теги, потому что то, чего хочет OP, не может быть достигнуто только с XPath - или вы предлагаете поставить его под «not-xpath»? Кстати, вы проверили свой адрес электронной почты? – 2010-11-22 17:03:49
@Dimitre: Я думаю, что тег xpath подходит по двум причинам: 1) вопрос «Можно ли это сделать с помощью XPath?» это полезный вопрос о XPath, даже если ответ «нет»; и 2), хотя эта задача не может быть выполнена только с XPath (не так много), ее можно было бы сделать с помощью XPath в сочетании с другими инструментами в среде, и в этом случае необходимо правильно получить выражение XPath. (Да, я скоро отвечу на электронную почту. :-) – LarsH 2010-11-22 17:23:07