Question

J'ai des données XML contenues dans trois fichiers (Database.xml, Participants.xml et ConditionTokens.xml). J'essaie d'utiliser des entités externes pour placer les participants et les jetons de condition dans le fichier de base de données, mais lorsque j'exécute ce code ...

string xmlPath = Environment.CurrentDirectory + @"\Data\Database.xml";
XElement database = XElement.Load(xmlPath);

... il n'y a pas de participants ni de jetons de condition dans mon xml (la propriété HasElements de & "base de données &" est fausse). Il devrait y avoir deux éléments enfants. Je ne reçois aucune erreur ni aucun avertissement dans Visual Studio (2008), et la validation de schéma en direct semble être satisfaisante, mais quelque chose ne va pas quand je lance mon code.

Quelqu'un pourrait-il me dire ce que je fais mal?

J'ai collé les trois fichiers XML ci-dessous.

Merci beaucoup!

-Dan

Database.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE database [
  <!ENTITY conditionTokens SYSTEM "ConditionTokens.xml">
  <!ENTITY participants SYSTEM "Participants.xml">]>
<database
  xmlns="experimentManager"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="experimentManager Database.xsd">
  &conditionTokens;
  &participants;
</database>

ConditionTokens.xml

<?xml version="1.0" encoding="utf-8" ?>
<conditionTokens>
  <conditionToken>
    <id>1</id>
    <token>LargeToSmall</token>
  </conditionToken>
  <conditionToken>
    <id>2</id>
    <token>SmallToLarge</token>
  </conditionToken>
</conditionTokens>

Participants.xml

<?xml version="1.0" encoding="utf-8" ?>
<participants>
  <participant>
    <id>1</id>
    <conditionTokenId>1</conditionTokenId>
  </participant>
  <participant>
    <id>2</id>
    <conditionTokenId>2</conditionTokenId>
  </participant>
</participants>
Était-ce utile?

La solution 2

J'ai fini par utiliser <xs:redefine> à la place.

Autres conseils

J'aurais utilisé la classe XmlDocument pour charger les 3 documents

XmlDocument xmlDatabase = new XmlDocument();
xmlDatabase.Load(databasePath);
XmlDocument xmlTokens = new XmlDocument();
xmlTokens.Load(tokensPath);
XmlDocument xmlParticipants = new XmlDocument();
xmlParticipants.Load(participantsPath);

Puis, en utilisant ImportNode et AppendNode, attachez-vous l'un à l'autre ...

xmlDatabase.FirstChild.AppendNode(xmlDatabase.ImportNode(xmlTokens.FirstChild), true);
xmlDatabase.FirstChild.AppendNode(xmlDatabase.ImportNode(xmlParticipants.FirstChild), true);

Cela devrait à peu près le faire (ou au lieu d'utiliser FirstChild, utilisez un sélecteur xpath?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top