«Символ«: », шестнадцатеричное значение 0x3A, не может быть включен в имя» - PullRequest
5 голосов
/ 27 августа 2011

У меня есть код, который будет читать некоторые XML-файлы.Я пробовал разные способы решить эту проблему, но не смог.Также я пытался кодировать так:

Namespace my = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30";                
XElement myEgitimBilgileri = XDocument.Load(@"C:\25036077.xml").Element("my:"+ "Egitim_Bilgileri"); 

Но все время одна и та же ошибка.Вот оригинал:

private void button2_Click(object sender, EventArgs e)
{                               
    XElement myEgitimBilgileri =    
    XDocument.Load(@"C:\25036077.xml").Element("my:Egitim_Bilgileri");

    if (myEgitimBilgileri != null)
    {
        foreach (XElement element in myEgitimBilgileri.Elements())
        {
            Console.WriteLine("Name: {0}\tValue: {1}", element.Name, element.Value.Trim());
        }
    }

    Console.Read();
}

Вот путь моего xml-файла:

<my:Egitim_Bilgileri>
        <my:egitimler_sap>
            <my:sap_eduname></my:sap_eduname>
            <my:sap_edufaculty></my:sap_edufaculty>
            <my:sap_eduprofession></my:sap_eduprofession>
            <my:sap_diplomno></my:sap_diplomno>
            <my:sap_edulevel></my:sap_edulevel>
            <my:sap_edustartdate xsi:nil="true"></my:sap_edustartdate>
            <my:sap_eduenddate xsi:nil="true"></my:sap_eduenddate>
        </my:egitimler_sap>
    </my:Egitim_Bilgileri>

, и это путь моего пространства имен в XML

xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30"

xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2008-01-23T00:43:17"

1 Ответ

12 голосов
/ 27 августа 2011

Код Element("my:" + "Egitim_Bilgileri") совпадает с Element("my:Egitim_Bilgileri"), что означает элемент с именем"my: Egitim_Bilgileri" в пространстве имен по умолчанию (существует неявное преобразование из строки в XName ).

Однако : недопустимо в имени элемента (вне разделения пространства имен) и, следовательно, приведет к выполнениюисключение по времени.

Вместо этого код должен быть Element(my + "Egitim_Bilgileri"), где my является XNamespace объектом.Оператор + объекта XNamespace, когда ему передается строка в качестве второго операнда, приводит к объекту XName , который затем можно использовать с методом Element(XName).

Например:

XNamespace my = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30";
XDocument doc = XDocument.Load(@"C:\25036077.xml");
// The following variable/assignment can be omitted,
// it is to show the + operator of XNamespace and how it results in XName
XName nodeName = my + "Egitim_Bilgileri";
XElement myEgitimBilgileri = doc.Element(nodeName);

Удачного кодирования ... и соболезнования в связи с необходимостью работать с InfoPath:)


В большинстве случаев я предпочитаю использовать XPath.Помимо прочего, он позволяет легко выбирать вложенные узлы и избегает необходимости «проверять на нулевое значение» каждый уровень, что может потребоваться для конструкций node.Element(x).Element(y).

using System.Xml.XPath; // for XPathSelectElement extension method
XmlNamespaceManager ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2011-01-11T08:31:30")
// Note that there is no XName object. Instead the XPath string is parsed
// and namespace resolution happens via the XmlNamespaceManager
XElement myEgitimBilgileri = doc.XPathSelectElement("/my:myFields/my:Egitim_Bilgileri", ns);
...