0

i have to fill up an XML file from a DATA TABLE ,my problem is that i have to get the schemaLocation in the root node ,for this i use the code below ,then i have this result,and i dont know where is p1 coming fromenter image description here enter image description here

lili1986
  • 27
  • 7

2 Answers2

0

Please try this code and let me know whether this helped you or not.

Particularly in this code i parse XML file and get the root element:

Then use it to select all attributes named schemaLocation. There is only one, so you can use SelectSingleNode:

The variable

schemaLocationAttribute

Contanins Value attribute through which you can get actual value.

        XmlReader xmlReader = XmlReader.Create("MyXML.xml");
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Load(xmlReader);

        XmlElement root = xmlDocument.DocumentElement;

        XmlNode schemaLocationAttribute = root.SelectSingleNode("//@*[local-name()='schemaLocation']");

        //Single schema value
        string schemaValue = schemaLocationAttribute.Value;

        //If you have multiple values in your schema 
        //you have to store it inside of array
        string[] multipleShcemavalues = schemaLocationAttribute.Value.Split(null);

        //And you have to choose whuickelement you want to use            
        string chooosendShcema = multipleShcemavalues[1];  //For example
So_oP
  • 1,211
  • 15
  • 31
0

In your resulting XML, p1 is a namespace. The code you have posted (in a screenshot) is defining the namespace "xsi", I'm not sure why your result is generating p1 unless you are renaming xsi somewhere that is not shown.

XmlDocument doc = new XmlDocument();
XmlDeclaration declaire = doc.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement rootnode = doc.CreateElement("BMECAT");
doc.InsertBefore(declaire, doc.DocumentElement);
doc.AppendChild(rootnode);
rootnode.SetAttribute("version", "2005");
XmlAttribute atr = doc.CreateAttribute("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance");
atr.Value = "http://www.adlnet.org/xsd/adlcp.vlp3";
rootnode.SetAttributeNode(atr);
rootnode.Attributes.Append(atr);

In your code:

XmlAttribute atr = doc.CreateAttribute("xsi", "schemaLocation", "http://www.w3.org/2001/XMLSchema-instance");

"xsi" is the name of the namespace it generates, you can control it there. This results in:

<?xml version="1.0" encoding="utf-8"?>
<BMECAT version="2005" xsi:schemaLocation="http://www.adlnet.org/xsd/adlcp.vlp3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

I'm not sure your code matches the result file you provided. When I ran the code, I get "xsi" as expected. If I set "xsi" to null there, it uses a default name, which in my case was d1p1. All instances of "xsi" were replaced with "d1p1". This makes me believe that code might be slightly different from what generated your result. I don't know where "d1p1" came from, it's likely a generated default namespace. This seems like a common default (Remove "d1p1" namespace prefix in DataContractSerializer XML output). In your provided code, if you change "xsi" to "p1" you would get your result.

I might suggest using this method instead: How to Add schemaLocation attribute to an XML document Here you would use the accepted answer against your XmlElement rootnode.

XmlElement.SetAttributeValue (localname, prefix, namespace, value)
mminneman
  • 426
  • 3
  • 7