2016-07-28 7 views
0

Я пытаюсь добавить новый элемент в существующий список элементов в XML-файле. Я использую этот код, чтобы инициировать элемент:Добавление XmlElement в список узлов без полномочий root с использованием VB.NET

Dim newElem As XmlElement = doc.CreateElement("/Content/Catalog/Feature[7]/Option") 

Но я получаю сообщение об ошибке, говоря, что я не могу использовать символ «/». Не знаете, как это решить?

UPDATE: Я добавляю два изображения, первый - это вид файла XML и где находятся данные. Файл: OriginalXML Выделенные в синих деталях - это то, что я хочу добавить (не обязательно должно быть в верхней части списка, добавление данных, вероятно, лучше). DisplayName, MultiMedia и CustomData - как простой CDATA-текст. Второй файл - это то, что происходит, когда я запускаю ваш код. (AfterCode.jpg). Обратите внимание, что выделенная опция «Option» кажется не в том месте, и форматирование теряется. Если вы хотите посмотреть на оригинальный файл XML, здесь: http://www.kwhdesign.ca/Temp/paf.xml

[OriginalXML] http://www.kwhdesign.ca/Temp/OriginalXML.jpg

(я не могу опубликовать более 2 ссылки, так что я постараюсь второе изображение! в другом комментарии)

Надеюсь, это поможет! еще раз спасибо!

ответ

0

Создайте элемент, затем добавьте туда, где вы хотите его с AppendChild:

Dim newElem As XmlElement = doc.CreateElement("Option") 
doc.SelectSingleNode("/Content/Catalog/Feature[7]").AppendChild(newElem) 

UPDATE

Это до сих пор не совсем понятно, что вы хотели сделать, но если вы хотите чтобы вставить новый элемент <Option> после последнего существующего <Option>, тогда что-то вроде этого было бы началом, хотя я думаю, что это показывает, насколько это утомительно (хотя вполне возможно, что есть более простой способ g разрешить новый вариант)!

Dim newOption = doc.CreateElement("Option") 
newOption.SetAttribute("code", "ZZZ") 
Dim displayName = doc.CreateElement("DisplayName") 
displayName.SetAttribute("lang", "en-US") 
displayName.AppendChild(doc.CreateCDataSection("This is a test")) 
newOption.AppendChild(displayName) 
Dim feature = doc.SelectSingleNode("/Content/Catalog/Feature[7]") 
Dim lastOption = feature.SelectSingleNode("Option[last()]") 
feature.InsertAfter(newOption, lastOption) 

Как @dbasnett, я предпочел бы XDocument/XElement и LINQ к XML. Добавление нового <Option> затем будет что-то вроде этого (заметим, что индексы 0 базируются здесь, в отличие от XPath):

Dim doc = XDocument.Load("paf.xml") 
doc.<Content>.<Catalog>.<Feature>(6).<Option>.Last().AddAfterSelf(
    <Option code="ZZZ"> 
    <DisplayName lang="en-US"><![CDATA[This is a test]]></DisplayName> 
    <Multimedia type="MediumImage"><![CDATA[Multimedia\Pictures\Medium\SherwinWilliams.jpg]]></Multimedia> 
    <Multimedia type="LargeImage"><![CDATA[Multimedia\Pictures\Large\SherwinWilliams.jpg]]></Multimedia> 
    <CustomData><![CDATA[<xml> 
    <RECKEY code="010201650004001V" /> 
    <VARProp VarID="1237" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3518" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="3580" PropID="Expression" Expr="SHERW" /> 
    <VARProp VarID="2149" PropID="VariableType" Expr="104" /> 
</xml>]]></CustomData> 
    </Option> 
) 
+0

Благодарим за быстрый ответ. Не знаете, почему это не работает, похоже, испортил формат XML-файла? Возможно, я смогу уточнить: У меня есть: // Содержание/Каталог/Особенность [7]/Опция [1]/code = ABC // Содержимое/Каталог/Функция [7]/Опция [2]/code = DEF ... и т. Д. Опция [68] Я хотел бы добавить: // Содержание/Каталог/Особенность [7]/Опция [1]/code = ZZZ Кстати, «код» - это атрибут (если это вопросы) Спасибо за любую помощь, которую вы можете предложить. – kman

+0

@kman Это поможет, если вы обновите вопрос, чтобы показать, чего вы пытаетесь достичь.Показывать до/после XML-примеры того, что вы хотите, и как это не работает. – Mark

+0

Я обновил свое сообщение. Вот ссылка второго изображения: [ссылка] http://www.kwhdesign.ca/Temp/AfterCode.jpg – kman

0

Я много предпочитаю использовать XElement для работы с XML. Вот пример использования xelement. В нем есть несколько отладочных инструкций, чтобы вы могли видеть, что происходит на каждом шаге. Надеюсь, поможет.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim xe As XElement 
    'to load from a file 
    ' xe = XElement.Load("Your Path Here") 

    'for testing you can do this 
    xe = <content> 
      <Catalog> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
       <feature></feature> 
      </Catalog> 
     </content> 

    'to add an element to the base 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    xe.AddFirst(New XElement("foo")) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    'to add an element to sub element 
    Dim optProto As XElement = <option></option> 
    Dim addthis As New XElement(optProto) 'note New 
    xe.<Catalog>...<feature>.ElementAt(3).Add(addthis) 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

    addthis.Value = "added" 'note 

    Debug.WriteLine("") 
    Debug.WriteLine(xe.ToString) 

End Sub 
+0

Спасибо dbasnett. Я хотел бы остаться с XmlDocument, а не использовать Xelement. Я попытался использовать XElement и смог получить результаты, которые я хотел, но нашел другие проблемы, такие как чтение значения одного узла или подсчет количества узлов, это, конечно, потому, что я не так хорошо знаком с XElement .. I просто не мог понять, как сделать эти две простые функции. Еще раз спасибо, возможно, вернемся к XElement. – kman