2015-01-14 3 views
1

Вот мой XML:XmlDocument.GetElementById() возвращает нуль

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE taxes[ 
<!ELEMENT tax (name,percent,description)> 
<!ATTLIST tax id CDATA #REQUIRED> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT percent (#PCDATA)> 
<!ELEMENT description (#PCDATA)> 
]> 
<taxes> 
    <tax id="Tax-1"> 
     <name>Tax 1</name> 
     <percent>6.75</percent> 
     <description>Ohio sales tax</description> 
    </tax> 
</taxes> 

И мой C# код:

XmlDocument doc = new XmlDocument(); 
doc.Load("path-to-file"); 

XmlElement element = doc.GetElementById("Tax-1"); 

Всякий раз, когда я пытаюсь сделать материал с element, я получаю NullReferenceException.

Я сделал некоторые исследования, и я обнаружил, что требуется действительный DTD, но, насколько я знаю, все справедливо ...

+0

HTTP: // StackOverflow. com/a/3775800/815938 – kennyzx

+0

@kennyzx Вы прочитали вопрос? У меня уже есть DTD, и это не HTML ... – djmordigal

+0

На основе http://xmlwriter.net/xml_guide/attlist_declaration.shtml и http://msdn.microsoft.com/en-us/library/system.xml. xmldocument.getelementbyid% 28v = vs.110% 29.aspx Кажется, вам нужно объявить id как идентификатор в DocType, а не как CDATA. – user92454

ответ

3

Ваш DTD неверен. Для вашего XML надлежащего DTD является:

<!DOCTYPE taxes[ 
<!ELEMENT taxes (tax*)> 
<!ELEMENT tax (name,percent,description)> 
<!ATTLIST tax id CDATA #REQUIRED> 
<!ELEMENT name (#PCDATA)> 
<!ELEMENT percent (#PCDATA)> 
<!ELEMENT description (#PCDATA)> 
]> 
+1

Исправлено! Огромное спасибо. Я также изменил CDATA для «id» на ID, и это, похоже, отлично работает. – djmordigal

0
<!ATTLIST tax id ID #REQUIRED> 

Ваш атрибут ID на ваш налоговый элемент также можно было бы назвать что-то другое, чем идентификатор, например, taxid:

<!ATTLIST tax taxid ID #REQUIRED>