У меня есть документ Xml, который определяет и ссылается на некоторые пространства имен. Я загружаю его в объект XmlDocument и, насколько мне известно, я создаю объект XmlNamespaceManager, с которым следует запрашивать Xpath. Проблема в том, что я получаю исключения XPath, что пространство имен "мое" не определено. Как мне получить диспетчер пространства имен, чтобы увидеть, что пространства имен, на которые я ссылаюсь, уже определены. Вернее, как мне получить определения пространства имен из документа в диспетчер пространства имен.
Кроме того, tt поражает меня так же странно, что вам нужно предоставить менеджер пространства имен документу, который вы создаете из документов, которые можно в первую очередь назначить. Даже если вам нужно жестко задавать пространства имен вручную, почему вы не можете добавить их непосредственно в документ. Почему вы всегда должны передавать этот менеджер пространства имен с каждым запросом? Что не может знать XmlDocument?
код:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(programFiles + @"Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\HfscBookingWorkflow\template.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(xmlDoc.NameTable);
XmlNode referenceNode = xmlDoc.SelectSingleNode("/my:myFields/my:ReferenceNumber", ns);
referenceNode.InnerXml = this.bookingData.ReferenceNumber;
XmlNode titleNode = xmlDoc.SelectSingleNode("/my:myFields/my:Title", ns);
titleNode.InnerXml = this.bookingData.FamilyName;
Xml:
<?xml version="1.0" encoding="UTF-8" ?>
<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:Inspection:-myXSD-2010-01-15T18-21-55" solutionVersion="1.0.0.104" productVersion="12.0.0" PIVersion="1.0.0.0" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003">
<my:DateRequested xsi:nil="true" />
<my:DateVisited xsi:nil="true" />
<my:ReferenceNumber />
<my:FireCall>false</my:FireCall>
Update:
ns.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
ns.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml");
ns.AddNamespace("xd", "http://schemas.microsoft.com/office/infopath/2003");
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2010-01-15T18:21:55");
Это делает это задание, но это означает, что я должен жестко кодировать эту конкретную схему xml. Эта схема представляет собой шаблон формы infopath. В частности, мой URL-адрес пространства имен будет отличаться для каждого шаблона формы, поэтому я действительно не хочу его жестко кодировать. Было бы неплохо найти чистый способ получить это пространство имен из xml, не прибегая к RegEx.
Я надеялся, что XmlNamespaceManager просто подобрал бы определения пространства имен из NameTable. Я имею в виду их в Xml, но я все еще должен их определять.