2013-09-27 1 views
2

Я хочу добавить XML-строку в качестве нового узла в существующий документ XML.Добавление любого пользователя в качестве узла в документе XML

Например, предположим, что входной сигнал от пользователя:

<bk:book> 
    <title>Pride And Prejudice</title> 
    <authorlastname>Jane</authorlastname> 
    <authorfirstname>Austen</authorfirstname> 
    <price>24.95</price> 
</bk:book> 

Я пытаюсь вставить этот пользовательский ввод следующим образом:

xml_SourceDoc.Root.LastNode.AddAfterSelf(XElement.Parse(xmlString)); 

Однако, это утверждение поднимает это исключение:

bk is an undeclared prefix. Line 1, position 2. 

Как я могу изменить свой подход, чтобы успешно вставить any текст, который вводит пользователь?

+1

'bk'_is_ - неопределенный префикс. Вы получаете это исключение из 'XElement.Parse'. Это не имеет никакого отношения к тому факту, что вы пытаетесь добавить узел в конец. –

+0

«Это не имеет никакого отношения к тому факту, что вы пытаетесь добавить узел в конец». Но я получаю исключение, как упоминалось выше. для добавления в качестве узла для роудинга мне нужно проанализировать строку как XElement. – user2822362

+1

Это связано с тем, что вы пытаетесь проанализировать недопустимый XML. Это произойдет, даже если вы не попытаетесь добавить недопустимый XML в конец. –

ответ

0

Проверьте XML является интерпретируемым первым:

Check well-formed XML without a try/catch?

if(IsValidXML(xmlString)) 
{ 
    xml_SourceDoc.Root.LastNode.AddAfterSelf(XElement.Parse(xmlString)); 
} 
+0

Я получаю такое же исключение. Исключение выбрано в XDocument doc = XDocument.Parse (xmlString); – user2822362

+0

Я хочу вставить xmlstring в xml-файл, каким бы он ни был. Даже если есть пространство имен, мне нужно вставить xml как узел в root. – user2822362

+0

-1 за идею удаления префикса, не понимая, что это значит. –

0

первым, создать XElement вы хотите добавить:

xmlString = new XElement(new XElement("book", new XAttribute("bk) ,(new XElement("title", titleValue), new EXelement("authorlastname", authorlastNameValue ... and so on.

затем добавить:

xml_SourceDoc.Root.Add(xmlString); 

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

2

Если вы действительно не знаете, что пользователь будет вводить, можно просто обработать его как CDATA через LINQ к XMLXCData Class.

Вот что ваши выборочные данные будут выглядеть при вставке в качестве узла в документе контейнер XML:

<doc> 
    <content><![CDATA[<bk:book> 
    <title>Pride And Prejudice</title> 
    <authorlastname>Jane</authorlastname> 
    <authorfirstname>Austen</authorfirstname> 
    <price>24.95</price> 
</bk:book>]]></content> 
</doc> 

А вот пример программы, которая создает в приведенном выше примере документ:

using System; 
using System.Xml; 
using System.Xml.Linq; 

public class CDataExample 
{ 
    public static void Main() 
    { 
     string documentXml = "<doc><content></content></doc>"; 
     XElement doc = XElement.Parse(documentXml, LoadOptions.None); 

     string userInput = 
@"<bk:book> 
    <title>Pride And Prejudice</title> 
    <authorlastname>Jane</authorlastname> 
    <authorfirstname>Austen</authorfirstname> 
    <price>24.95</price> 
</bk:book>"; 

     XCData cdata = new XCData(userInput); 
     doc.Element("content").Add(cdata); 

     Console.WriteLine(doc.ToString()); 
    } 
}