2014-09-24 133 views
0

我想在我的XML文件中添加新節點,但由於導航器的當前位置,我得到InvalidOperationException。用XML添加新節點的問題

這是我的XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<dictionary xmlns="RecnikSema.xsd"> 

<sentiments> 

    <sentiment word="napustiti">-2</sentiment> 

</sentiments> 

</dictionary> 

和架構:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="dictionary"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="sentiments"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="sentiment"> 
       <xs:complexType> 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute type="xs:string" name="word"/> 
         <xs:attribute type="xs:double" name="value"/> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

C#中的代碼,我使用添加一個新的節點如下:

XmlDocument dictionary= new XmlDocument(); 
dictionary.Load(@"C:\Users\Luka\Documents\Visual Studio 2013\Projects\TSA\TSA\Dictionary.xml"); 
XPathNavigator navigator = dictionary.CreateNavigator(); 

navigator.MoveToChild("dictionary", @"C:\Users\Luka\Documents\Visual Studio 2013\Projects\TSA\TSA\RecnikSema.xsd"); 
navigator.MoveToChild("sentiments", @"C:\Users\Luka\Documents\Visual Studio 2013\Projects\TSA\TSA\RecnikSema.xsd"); 
navigator.MoveToChild("sentiment", @"C:\Users\Luka\Documents\Visual Studio 2013\Projects\TSA\TSA\RecnikSema.xsd"); 

navigator.InsertAfter("<sentiment word=\"" + token + "\">" + value + "</sentiment>"); 

發生在最後一行的例外是InsertAfter

我在這裏做錯了什麼?

+0

嘿馬里奧,這只是我在發佈時在變量和屬性翻譯過程中犯的一個錯誤。 因此,InvalidOperationException異常,解釋如下: System.Xml.dll中發生未處理的類型爲「System.InvalidOperationException」的異常 附加信息:由於導航器的當前位置,操作無效。 – LukaVazic 2014-09-24 11:36:40

回答

0

爲什麼不要通過使用XDocument來簡化隊友。

C#的新版本已經有了這個類,可以很容易地操縱Xml。因此,它也支持Xml Linq。

以下是可能對您有用的快速解決方案。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XDocument document = XDocument.Load(@"C:\Users\amit\SkyDrive\code\WebApplication1\ConsoleApplication1\xml.xml"); 
      XElement root = new XElement("sentiment"); 
      root.Value = "3"; 
      root.Add(new XAttribute("word", "napustiti")); 
      XNamespace nsSys = "RecnikSema.xsd"; 
      document.Element(nsSys + "dictionary").Element(nsSys + "sentiments").Add(root); 
      document.Save("c:\newFile.xml"); 
     } 
    } 
} 
+0

嗯,我試過這段代碼,但沒有任何內容寫入XML,因爲我得到的NullRefferenceException與消息對象引用未設置爲對象的實例。 我在做什麼錯? – LukaVazic 2014-09-24 21:51:21

+0

編輯: 從document.Element刪除nsSys刪除了異常。它現在有效! – LukaVazic 2014-09-24 22:04:18

+0

好的隊友......你越來越好。 – codebased 2014-09-25 00:31:55

0

MoveToChild()中,第二個參數是XML名稱空間,而不是文檔的位置。在你的情況下,你已經設置了xmlns="RecnikSema.xsd"。這意味着MoveToChild不能找到匹配,那麼當你到insertAfter,當前節點還是根節點<dictionary>,並試圖像這樣創建XML:

<?xml version="1.0" encoding="utf-8" ?> 
<dictionary xmlns="RecnikSema.xsd"> 
    <sentiment word="napustiti">-2</sentiment> 
</dictionary> 
<sentiment word="foo">5</sentiment> 

這有2種元素等你拿錯誤

相反,你需要通過"RecnikSema.xsd"作爲參數:

navigator.MoveToChild("dictionary", "RecnikSema.xsd"); 
navigator.MoveToChild("sentiments", "RecnikSema.xsd"); 
navigator.MoveToChild("sentiment", "RecnikSema.xsd"); 

我不知道你的意思是設置這是因爲它是架構文件的命名空間,所以也許你的意思呢? :

XML

<?xml version="1.0" encoding="utf-8" ?> 
<dictionary xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="RecnikSema.xsd"> 
    <sentiments> 
     <sentiment word="napustiti">-2</sentiment> 
    </sentiments> 
</dictionary> 

C#

XmlDocument dictionary= new XmlDocument(); 
dictionary.Load(@"C:\Users\Luka\Documents\Visual Studio 2013\Projects\TSA\TSA\Dictionary.xml"); 
XPathNavigator navigator = dictionary.CreateNavigator(); 

navigator.MoveToChild("dictionary", ""); 
navigator.MoveToChild("sentiments", ""); 
navigator.MoveToChild("sentiment", ""); 

navigator.InsertAfter("<sentiment word=\"" + token + "\">" + value + "</sentiment>"); 
0

我覺得你的問題是,你沒有指定的maxOccurs(默認爲1),你媒體鏈接元素的添加。請參閱http://www.w3schools.com/schema/el_sequence.asp

maxOccurs可選。指定元素在父元素中可能發生的最大次數 。該值可以是任意數字> = 0,或者如果您不想限制最大數量,請使用值「無界」的值 。默認值爲1

所以你多情緒的解決方案:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="dictionary"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="sentiments"> 
      <xs:complexType> 
      <xs:sequence maxOccurs="unbounded"> 
       <xs:element name="sentiment"> 
       <xs:complexType> 
        <xs:simpleContent> 
        <xs:extension base="xs:string"> 
         <xs:attribute type="xs:string" name="word"/> 
         <xs:attribute type="xs:double" name="value"/> 
        </xs:extension> 
        </xs:simpleContent> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

我寧願使用Microsoft XSD工具來生成CLR類 - >http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx和使用的XMLSerializer - >http://msdn.microsoft.com/de-de/library/system.xml.serialization.xmlserializer(v=vs.110).aspx